Загрузка файлов .class через URLClassLoader — NoClassDefFoundError

Я знаю, что этот вопрос задавался несколько раз (например, здесь), но ни один из ответов мне не подходит. Это домашнее задание, я должен «взломать» несколько файлов классов через 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.

Моя конфигурация пути к классам выглядит так:

Загрузка файлов .class через URLClassLoader — NoClassDefFoundError

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

Похоже, вы переместили файлы .class без сохранения необходимой структуры каталогов. Скомпилированный класс Java, источник которого был объявлен с помощью package ea_6_1;должен, находится в каталоге с именем ea_6_1.

VGR 20.06.2019 15:55

@VGR Спасибо, я узнал то же самое пару минут назад. Эти файлы были в том виде, в котором они были предоставлены, вокруг них не было структуры каталогов. Если вы опубликуете свой комментарий в качестве ответа, я приму его.

Lennart 20.06.2019 15:58
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

Другие вопросы по теме