Как я могу использовать BundleWiring для поиска связей Bundle / Class (ранее это делалось через PackageAdmin)? - PullRequest
1 голос
/ 07 июля 2011

Я в процессе обновления моего приложения до последней версии Eclipse Equinox 3.7 и связанных библиотек.Я рад иметь общую поддержку в OSGi 4.3 и копать новые концепции Bundle.adapt ().Я столкнулся с одним камнем преткновения.

Ранее я использовал PackageAdmin.getBundle (Class), чтобы узнать, какой пакет загрузил какие классы.Я должен сделать это из-за некоторого использования сериализации объекта RMI.

ВОПРОС: Есть ли способ достичь того же результата, сопоставив Class с Bundle, используя новый API BundleWiring?

Я понимаю, что PackageAdmin, вероятно, не исчезнетв ближайшее время, но я ненавижу предупреждения об устаревании.

1 Ответ

3 голосов
/ 07 июля 2011

Кинда смутилась, что не нашла этого в первый раз, когда просмотрела документ.Отвечая на мой вопрос о полноте.

Из базовой спецификации PDF ...

Раздел 3.9.9 - Поиск связки объекта

В некоторых случаях требуется связкав коде, который не имеет доступа к контексту пакета.По этой причине платформа предоставляет следующие методы:

Framework Util - через класс FrameworkUtil с методом getBundle (Class).Инфраструктура предоставляет этот метод, чтобы позволить коду найти пакет объекта, не имея разрешения на получение загрузчика классов.Метод возвращает значение NULL, если класс не происходит из пакета.

Загрузчик классов - платформа OSGi должна гарантировать, что загрузчик классов из набора, реализующего интерфейс, реализует интерфейс BundleReference.Это позволяет унаследованному коду найти пакет объекта, получив его загрузчик классов и приведя его к объекту BundleReference, который обеспечивает доступ к Bundle.Однако для этого требуется, чтобы код имел разрешение на доступ к загрузчику классов.Следующий фрагмент кода показывает, как получить объект Bundle из любого объекта.

ClassLoader cl = target.getClassLoader();
if ( cl instanceof BundleReference ) {
BundleReference ref = (BundleReference) cl;
Bundle b = ref.getBundle();
...
}

В системе OSGi не все объекты принадлежат платформе.Поэтому возможно получить загрузчик класса, который не реализует интерфейс BundleReference, например загрузчик пути к классу загрузки.

...