我有以下类层次结构
在
parent
中声明了 child1
和bundle_1
。 child2
bundle_2
哪个类加载器child2
将用于加载超类?
答案 0 :(得分:1)
在OSGi中,每个捆绑包有一个ClassLoader。加载类时,ClassLoader将首先查看bundle的Import-Package语句。如果该类来自导入的包,则将加载委托给提供包的包的ClassLoader。如果这些都不匹配,那么bundle将尝试从其自己的类加载该类。 (这有点简化,但对你的情况应该足够了。)
所以parent_1和class1类将由bundle_1的ClassLoader加载,而child2将由bundle_2的ClassLoader加载。
要记住的另一件事。 java中的每个类都存储在" class" .getClassLoader()中创建此类的ClassLoader。因此,这可以让您轻松检查实际发生的情况。只需实例化child1和child2并打印ClassLoaders。
与此相关的另一件事是,如果在类A的代码中使用new" Classname"(),那么这将触发加载A类的ClassLoader。(然后可以委托当然)。
答案 1 :(得分:0)
鉴于类是由类名和加载类的类加载器唯一标识的,parent
和child1
必须由{{1}的类加载器加载}。 bundle_1
的类加载器将加载child2
。