У меня есть приложение, которое позволяет, используя абстрактный класс, люди писать свои собственные реализации. Я загружаю эти реализации как .class-файлы из каталога. В настоящее время у меня есть это решение:
File classDir = new File("/users/myproject/classes/");
URL[] url = { classDir.toURI().toURL() };
URLClassLoader urlLoader = new URLClassLoader(url);
String filename;
for (File file : classDir.listFiles()) {
filename = string.getFilenameWithoutExtension(file);
if (filename.equals(".") || filename.equals("..") || filename.startsWith("."))
continue;
AbstractClass instance = (AbstractClass)urlLoader
.loadClass("org.mypackage." + filename)
.getConstructor(ConfigUtil.class, DatabaseUtil.class, StringUtil.class)
.newInstance(config, database, string));
instance.doSomething();
}
Как видите - мне нужно указать пакет, в котором расположены классы, чтобы правильно их загрузить. Пропустив посылку, я получаю
java.lang.NoClassDefFoundError:
MyClass (wrong name: org/mypackage/MyClass)
ошибка.
Теперь, из архитектурного POV, я думаю, что очень плохо спроектировано, что классы, разработанные другими людьми, должны быть скомпилированы в МОЙ пакет при загрузке.
Поэтому я спрашиваю вас: есть ли способ загрузить классы из файловой системы без указания пакета, в котором они находятся?