【发布时间】:2019-07-07 17:58:30
【问题描述】:
在过去的几周里,我正在探索 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 并且捆绑包 samplebundle 被连接到 com.test.packag 的strong>系统包[0]。
所以,我想了解 system bundle[0] 如何访问由不同类加载器(App 类加载器)加载的系统包。不仅所有 OSGI 的核心类如 Bundle、BundleActivator、Felix 也由 App 类加载器加载。因此,我尝试调试 Felix 代码以了解系统包是否将 loadClass() 请求委托给 App 类加载器。不幸的是,在调试时我观察到 BundleWiringImpl 类的 m_wiring 变量,我注意到系统包的类加载器是 null(这是不可能的,因为引导类加载器只加载 java.* 包)。
如果我错了,请纠正我的理解。
我的问题是
system_bundle[0]的类加载器是什么,它的父类加载器又是什么?
如果system_bundle类加载器的父类不是App类加载器,系统包是否也维护了package=>classloader的映射来加载由app类加载器加载的类?
类加载器(捆绑类加载器、系统类加载器、引导类加载器和应用类加载器)的层次结构到底是什么?
谢谢。
【问题讨论】:
标签: osgi apache-felix equinox dynamic-class-loaders embedded-osgi