У меня есть приложение, которое позволяет людям, используя абстрактный класс, писать свои собственные реализации. Я загружаю эти реализации как файлы .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)
.
Теперь, исходя из архитектурной точки зрения, я думаю, что это очень плохо спроектировано, что классы, разработанные другими людьми, должны быть скомпилированы в МОЙ пакет при их загрузке.
Итак, я спрашиваю вас: есть ли способ загружать классы из файловой системы без необходимости указывать пакет, в котором они находятся?