Как загрузить класс, который реализует интерфейс из файла jar во время выполнения?

Я хочу реализовать приложение, которое могло бы использовать реализованные пользователями классы. В каждом классе должен быть реализован интерфейс, который я определяю, и, наконец, все классы, реализованные пользователем, заархивированы в файле jar. Пользователи копируют файлы jar в путь к классу, а затем дают только имя файла jar моему приложению. Мое приложение должно иметь возможность динамически загружать файл jar. Для этого я нашел этот пост, который очень полезен, но он загружает классы по именам классов. Я хочу загрузить классы на основе их родителей.

public class A implements iA {
    @Override
    int getAValue() { ... }
}

public class B implements iB {
     @Override
     int getBValue() { ... }
}

Предположим, что загруженный файл jar имеет классы A и B. Я хочу получить экземпляр класса B, зная имя интерфейса iB.

Что я должен делать?


person Mir Milad Hosseiny    schedule 24.02.2012    source источник


Ответы (1)


Ознакомьтесь с этим сообщением: Найти классы Java, реализующие интерфейс

Он говорит о решении того, что вы хотите.

Я знаю, что я собираюсь предложить не самый легкий способ сделать это, но вы только что описали один из фундаментальных вариантов использования архитектуры плагинов в Java и историю успеха OSGi.

Я бы предложил использовать что-то легкое, например Apache Felix, сделать банку, которую предоставляет пользователь, реализовать простой osgi.BundleActivator и зарегистрировать реализацию вашего интерфейса как службу OSGi. (Это просто причудливая хеш-карта, не имеющая ничего общего с сервисами REST и т.п.).

Затем вы можете просто получить все реализации данного интерфейса. Это довольно прямолинейно. Вы можете ознакомиться с документацией Felix здесь: http://felix.apache.org/site/apache-felix-framework-launching-and-embedding.html

person Pavan    schedule 24.02.2012
comment
тоже люблю osgi, это довольно болезненно, когда вы начинаете с osgi, но оно того стоит. Я думаю, вы должны упомянуть также авторазвертывание феликса, это больше подойдет для его случая. - person hope_is_grim; 24.02.2012