как системный пакет имеет доступ к системным пакетам? - PullRequest
0 голосов
/ 13 февраля 2019

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

System.out.println("ClassInBundle class is loaded by "+ClassInBundle.class.getClassLoader());
System.out.println("ClassInBundle parent class is "+ClassInBundle.class.getClassLoader().getParent());

Вывод кода выше, который находится в комплекте samplebundle , равен

ClassInBundle class is loaded by com.sample.bundle.samplebundle [34]
ClassInBundle parent class is null

и для импорта в комплекте он поддерживает карту packagename => classloader, чтобы он мог делегировать запросы правильному загрузчику классов

Bundle SB = felix.getBundleContext().getBundle(0);
List<BundleWire> sbwires=SB.adapt(BundleWiring.class).getRequiredWires(null);
List<BundleWire> li=bundle.adapt(BundleWiring.class).getRequiredWires(null);
for(BundleWire i : li){
    System.out.println(i);
}

Вывод для приведенного выше кода

[com.sample.bundle.samplebundle [34](R 34.0)] osgi.wiring.package; (osgi.wiring.package=com.test.packag) -> [org.apache.felix.framework [0](R 0)]
[com.sample.bundle.samplebundle [34](R 34.0)] osgi.wiring.package; (&(osgi.wiring.package=org.osgi.framework)(version>=1.8.0)(!(version>=2.0.0))) -> [org.apache.felix.framework [0](R 0)]
[com.sample.bundle.samplebundle [34](R 34.0)] osgi.wiring.package; (&(osgi.wiring.package=org.osgi.framework.wiring)(version>=1.2.0)(!(version>=2.0.0))) -> [org.apache.felix.framework [0](R 0)]
[com.sample.bundle.samplebundle [34](R 34.0)] osgi.ee; (&(osgi.ee=JavaSE)(version=1.6)) -> [org.apache.felix.framework [0](R 0)]

Как вы можете видеть в первой строке вышеприведенного вывода, пакет com.test.packag добавляется как FelixConstants.FRAMEWORK_SYSTEMPACKAGES , а выборка пакета -подключен к системному пакету [0] для com.test.packag .

Итак, я хотел понять, как системный пакет [0] может получить доступ к системным пакетам, которыезагружается другим загрузчиком классов (App class loader).Мало того, что все основные классы OSGI, такие как Bundle, BundleActivator, Felix, также загружаются загрузчиком классов App.Итак, я попытался отладить код Felix, чтобы понять, делегирует ли системный пакет запросы loadClass () загрузчику классов приложений.К сожалению, во время отладки я заметил переменную m_wiring класса BundleWiringImpl, и заметил, что загрузчик классов системного пакета равен null (что невозможно, поскольку загрузчик загрузочного класса загружает только пакеты java. *).

пожалуйста, исправьте мое понимание, если я ошибаюсь.

Мои вопросы здесь

Что такое загрузчик классов system_bundle [0] и каков его родительский загрузчик классов?

если родителем загрузчика классов system_bundle не является загрузчик классов приложений, разве системный комплект также поддерживает карту package => classloader для загрузки классов, загружаемых загрузчиком классов приложений?

чтокакова иерархия загрузчиков классов (загрузчиков классов комплектов, загрузчиков классов системы, загрузчиков классов загрузки и загрузчиков классов приложений)?

Спасибо.

1 Ответ

0 голосов
/ 14 февраля 2019

Обычно OSGi Framework (он же System Bundle) загружается загрузчиком приложений и, следовательно, имеет видимость всего остального в загрузчике приложений и его родителях, т.е. загрузчике расширений и загрузчике.

Itна самом деле зависит от того, как вы пишете свой лаунчер.Вы можете встроить OSGi в любое стандартное Java-приложение, просто создав экземпляр FrameworkFactory и используя его для запуска Framework.Когда вы делаете это, каркас OSGi становится просто еще одной библиотекой на пути к классам, и он имеет видимость того же набора классов, что и ваш собственный код.Например, вы могли бы встроить OSGi Framework в сервлет, развернутый на сервере приложений J2EE ... в этом случае системный комплект будет иметь видимость для всех типов, доступных в веб-приложении, в зависимости от содержимогоWEB-INF.Вы даже можете встроить OSGi Framework в пакет, развернутый в другой OSGi Framework ... Начало OSGi!

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

...