Я знаю, что этот вопрос задавался несколько раз (например, здесь), но ни один из ответов мне не подходит. Это домашнее задание, я должен «взломать» несколько файлов классов через 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.
Моя конфигурация пути к классам выглядит так:
Это проблема конфигурации или я неправильно использую URLClassLoader? Может быть, есть другой способ загрузки файлов классов?
@VGR Спасибо, я узнал то же самое пару минут назад. Эти файлы были в том виде, в котором они были предоставлены, вокруг них не было структуры каталогов. Если вы опубликуете свой комментарий в качестве ответа, я приму его.
Похоже, что кто-то переместил файлы .class без сохранения необходимой структуры каталогов.
Класс Java, объявленный с помощью package ea_6_1;
должен, находится в каталоге с именем ea_6_1
(по крайней мере, в каждой реализации Java, о которой я знаю).
Похоже, вы переместили файлы .class без сохранения необходимой структуры каталогов. Скомпилированный класс Java, источник которого был объявлен с помощью
package ea_6_1;
должен, находится в каталоге с именемea_6_1
.