Inheritance OSGI:类加载和继承

Inheritance OSGI:类加载和继承,inheritance,osgi,classloader,Inheritance,Osgi,Classloader,我有下面的类层次结构 bundle\u 1中声明的父级和child1儿童2在bundle_2 哪个类加载器child2将用于加载超类?鉴于类由类名和加载类的类加载器唯一标识,因此父类和child1必须由bundle\u 1的类加载器加载child2将由bundle_2的类加载器加载。在OSGi中,每个bundle有一个类加载器。加载类时,类加载器将首先查看包的导入包语句。如果类来自导入的包,那么加载将委托给提供包的包的类加载器。如果这些都不匹配,那么包将尝试从自己的类加载类。(这稍微简化了一点

我有下面的类层次结构

bundle\u 1
中声明的父级
child1
<代码>儿童2
bundle_2


哪个类加载器
child2
将用于加载超类?

鉴于类由类名和加载类的类加载器唯一标识,因此
父类和
child1
必须由
bundle\u 1
的类加载器加载
child2
将由
bundle_2

的类加载器加载。在OSGi中,每个bundle有一个类加载器。加载类时,类加载器将首先查看包的导入包语句。如果类来自导入的包,那么加载将委托给提供包的包的类加载器。如果这些都不匹配,那么包将尝试从自己的类加载类。(这稍微简化了一点,但对于您的情况应该足够了)

因此,父类和child1类将由bundle_1的类加载器加载,child2将由bundle_2的类加载器加载

还有一件事要记住。java中的每个类都将创建该类的类加载器存储在“class.getClassLoader()中。因此,这使您可以轻松地检查实际发生的情况。只需实例化child1和child2并打印类加载器


与此相关的另一件事是,如果在类a的代码中使用新的“Classname”(),那么这将触发加载类a的类加载器(当然可能会委托)。

但是child2的超级构造函数将在bundle_1上调用?您的问题没有给出足够的信息。这些类在哪些包中?捆绑包实际导出和导入哪些包?此外,调用意味着您正在谈论线程。线程不属于捆绑包。@gstackoverflow:构造函数调用实际上限制了与类加载的关系。您需要澄清“child2的超级构造函数将在bundle_1上调用”或更好的含义:您首先提出这个问题的原因。@Arie van Wijngaarden父类将加载两次吗?父类将加载两次吗?否。由于类加载是委托的,bundle 1的类加载程序将知道它已经加载了父类。