Я изучаю, как реализован 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 для загрузки классов, загружаемых загрузчиком классов приложений?
чтокакова иерархия загрузчиков классов (загрузчиков классов комплектов, загрузчиков классов системы, загрузчиков классов загрузки и загрузчиков классов приложений)?
Спасибо.