Загрузка файлов .class через URLClassLoader - NoClassDefFoundError - PullRequest
0 голосов
/ 20 июня 2019

Мне известно, что этот вопрос задавался несколько раз (например, здесь ), но ни один из ответов, похоже, не работает для меня. Это домашнее задание, я должен «взломать» несколько файлов классов с помощью API отражения, но я даже не могу их загрузить.

Есть три .class файла (Inscription.class, Decoder.class, Safe.class), которые я вставил в D:\class\. Затем я пытаюсь загрузить их через URLClassLoader:

 public void Load() throws MalformedURLException {
        ClassLoader loader = this.getClass().getClassLoader();
        File classFolder = new File("D://class//");
        // classFolder.exists() returns true at this point.

        URLClassLoader urlClassLoader = new URLClassLoader(new URL[]{classFolder.toURI().toURL()},loader);

        // urlClassLoader.classes is empty at this point, which is suspicous

         urlClassLoader.loadClass("Safe");
         // throws NoClassDefFoundError (wrong name: ea_6_1/Safe)
         // Interestingly, it seems to find a package name (ea_6_1)

         urlClassLoader.loadClass("ea_6_1.Safe");
         // throws ClassNotFoundException
    }

Я также пытался загрузить файлы один за другим, но, видимо, это не должно работать, так как URLClassLoader принимает только каталоги или файлы JAR:

   URL inscription = loader.getResource("Inscription.class");
   URL safe = loader.getResource("Safe.class");
   URL decoder = loader.getResource("Decoder.class");

   URLClassLoader urlClassLoader = new URLClassLoader(new URL[]{inscription, safe, decoder});

   // Exact same behavior as above.

Моя конфигурация classpath выглядит следующим образом:

enter image description here

Это проблема конфигурации или я неправильно использую URLClassLoader? Есть ли другой способ загрузки файлов классов?

1 Ответ

1 голос
/ 20 июня 2019

Похоже, кто-то переместил файлы .class без сохранения требуемой структуры каталогов.

Класс Java, объявленный с package ea_6_1; , должен находиться в каталоге с именем ea_6_1 (по крайней мере, в каждой реализации Java, которую я знаю).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...