Динамическая внешняя загрузка классов
Я пытаюсь получить опыт динамической загрузки классов в Java. Так что любые комментарии и помощь приветствуются. У меня есть программа, которая позволяет пользователю выбрать файл и выполнить некоторые действия с ним. Действия - это "Команды", это класс, который я пытаюсь загрузить.
Это работает так: пользователь помещает файл.class в нужную папку, моя программа проверяет файлы в папке и, если в файле.class есть класс, загружает его.
Я сделал это, но не так, как я хотел. На данный момент он работает только с классами, которые были скомпилированы с моей программой. Но я хочу, чтобы я мог поместить в папку любой файл.class, содержащий класс, и моя программа его загрузила. Это мой код сейчас:
for (int i = 0; i < fileList.length; i++) {
if (fileList[i].endsWith(".class")) {
/////MY FIRT TRY/////ClassLoader myClassLoader = ClassLoader.getSystemClassLoader();
ClassLoader classLoader = FileMod.class.getClassLoader();
// Define a class to be loaded.
String classNameToBeLoaded = fileList[i].replace(".class", "");
// Load the class
try {
/////MY FIRST TRY/////Class myClass = myClassLoader.loadClass(classNameToBeLoaded);
//if the class exists in the file
Class aClass = classLoader.loadClass(classNameToBeLoaded);
classList.add(aClass);
System.out.println("CLASS FOUND : " + classNameToBeLoaded + aClass.getSuperclass());
} catch (ClassNotFoundException e) {
System.out.println("CLASS NOT FOUND : " + classNameToBeLoaded);
continue;
}
}
}
Как видите, я пробовал два способа, первый в настоящее время находится в комментариях. Я проверяю каждый файл в папке и проверяю, является ли он файлом.class, если да, я пытаюсь загрузить класс, если он есть. Я думаю, что два classLoaders
могу загружать только те файлы, которые они "знают", так как я могу загрузить внешний класс.
1 ответ
Как правило, вам нужен новый загрузчик классов. использование java.net.URLClassLoader.newInstance
, Осторожно, теперь вы загружаете классы извне в ваше приложение.
(Некоторые загрузчики классов позволят вам добавлять местоположения, но это настоящий взлом.)