Загрузка классов из папки без указания пакета - PullRequest
5 голосов
/ 08 февраля 2012

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

Поэтому я спрашиваю вас: есть ли способ загрузить классы из файловой системы без указания пакета, в котором они находятся?

Ответы [ 2 ]

3 голосов
/ 08 февраля 2012

Да; реализовать интерфейс (или использовать аннотацию).

Затем используйте любую библиотеку сканирования классов (есть много SO вопросов по этому поводу, например, this ), чтобы загрузить конкретный рассматриваемый класс. Поиск по запросу «Сканирование классов Java» или «Механизм подключаемых модулей Java» поможет.

Вы также можете просто использовать Java Plugin Framework и избегать некоторых усилий. Хотя мне не ясно, поддерживается ли оно больше, я знаю, что люди все еще используют его.

1 голос
/ 08 февраля 2012

Вы можете использовать ServiceProvider для загрузки реализаций, которые вы не знаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...