2016-01-22 2 views
0

У меня есть интерфейс под названием «Foo», и у меня есть пакет «b».Как получить все классы, реализующие интерфейс в определенном комплекте OSGi

Теперь я хочу, чтобы все классы реализации интерфейса «Foo» в расслоении б

Что-то, как показано ниже

org.osgi.framework.Bundle bundle = ...; 
List<Class<? extends Foo>> allImplemetation = getAllImplementation(bundle); 
+0

Зачем вы хотите это сделать? Это для какого-то механизма расширяемости? –

+0

Я делаю небольшой, где пользователь может установить пакеты (это не BundleContext.install). Здесь я хочу вызвать метод во всех реализациях Foo в установленных пакетах пользователя. –

ответ

3
  1. Чистый способ найти реализацию в OSGi, чтобы позволить каждому расслоением опубликовать каждая реализация в качестве службы OSGi. Это позволяет сохранить закрытые классы impl и убедиться, что ваш центральный пакет хорошо отделен от пользовательских пакетов. Here you can find some guidance how to do this.

  2. Если это невозможно, вы можете использовать BundleTracker, чтобы получить обратный вызов при установке новых пакетов. Затем вы можете использовать Javassist или XBean finder для сканирования пути класса пакета для классов, реализующих и интерфейсов. Однако этот вариант довольно сложно сделать правильно. Поэтому я постараюсь избежать этого.

  3. В качестве одного из путей решения дороги следует использовать тот же подход, что и ServiceLoader. Вы создаете файл в специальном каталоге в банках, который содержит имена классов загружаемых реализаций. Затем вы можете использовать BundleTracker, как показано выше, чтобы найти недавно установленный пакет, прочитать этот ресурс и затем использовать ClassLoader пакета для загрузки класса реализации.

+0

Я бы настоятельно рекомендовал придерживаться подхода к обслуживанию (нет 1). Если пакет хочет предложить класс, он должен опубликовать его как услугу. Альтернатива, заключающаяся в том, что в вашей внутренней части рождается очередной пучок, слишком навязчива и может вызвать неожиданное поведение. –

+0

Я собираюсь с первого раза –

Смежные вопросы