Не удается получить типизированный экземпляр класса из комплекта OSGI - PullRequest
1 голос
/ 09 октября 2019

У меня следующая ситуация. Мне нужен экземпляр класса A в моем приложении, и этот класс A происходит из Bundle B (osgi) и находится в пакете X в этом Bundle. Что я сделал до сих пор: я добавил пакет B в локальный репозиторий maven и добавил его в свой pom как зависимость с «предоставленной» областью действия. Я также добавил пакет X из комплекта B, где класс A находится в моем pom с помощью Dynamic-import в моем pom.xml. Здесь следует отметить одну вещь - пакет X НЕ экспортируется из Пакета B, но я знаю, что он все еще может работать, я видел, как коллеги это делают, но я не настолько хорош.

В любом случае, как япытаюсь получить экземпляр класса ниже:

Bundle bundle;
Class<?> checkClass=bundle.loadClass("full path to class A");

TypeOfClassA newClass=checkClass.newInstance();

и вот я получаю:

java.lang.ClassNotFoundException ClassA not found by myapplication
at 

org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation (BundleWiringImpl.java:1532) в

org.apache.felix.framework.BundleWiringImpl.access $ 400 (BundleWiringImpl.java:75)

Но почему? У меня загружен фляга, я использую загрузчик классов комплекта, также, если я приведу checkClass к объекту, я смогу увидеть методы и поля класса A, поэтому выглядит хорошо, как я могу получить экземпляр класса A?

Ответы [ 2 ]

2 голосов
/ 11 октября 2019

Когда вы пишете что-то вроде PluginA test=(PluginA) classloader.loadclass("PluginA").newInstance(), вам необходимо импортировать класс PluginA, который, как упоминал Кристиан, возможен только в том случае, если он экспортируется из пакета, в котором он находится. Должно работать следующее:

Object test= classloader.loadclass("PluginA").newInstance()

Затем вам нужно будет использовать отражения для доступа к методам класса и т. Д.

2 голосов
/ 09 октября 2019

В OSGi существует разница между временем компиляции и временем выполнения. Во время компиляции вы видите классы вашего собственного jar и все зависимости от maven.

Во время выполнения пакет по умолчанию видит только свои собственные классы. Любые другие пакеты нуждаются в выражении Import-Package в Манифесте. Обычно это автоматически создается bnd, когда вы используете класс. Когда бы ни было возможно, вы должны полагаться на этот автоматизм.

Ваш случай, конечно, отличается, так как пакет, к которому вы хотите получить доступ, не экспортируется пакетом B. В этом случае нет способа достичь класса A через загрузчик классов пакета. вашего собственного пакета.

Вместо этого вам нужно использовать загрузчик классов пакета пакета В. Вы можете получить пакет B, например, из BundleContext. Затем вы можете загрузить класс.

Другой вариант заключается в том, что вы используете экспортированный класс C из пакета B и загрузчик классов класса C для загрузки класса A.

В любом случае этохак. Вам следует избегать использования закрытых классов другого пакета.

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