假设我们有两个捆绑包A和B.
捆绑私人包裹:
class ClassA extends ClassB{}
捆绑B - 导出包:
class ClassB{
private ClassC classC=new ClassC();
}
捆绑B - 私人包裹:
class ClassC{}
当我在bundle A中创建ClassA的实例时,它已成功创建。但为什么?我们确实需要ClassC,但捆绑A类加载器并没有看到它。
答案 0 :(得分:4)
非常好的问题。它实际上花了我几年时间,直到我弄清楚它是如何工作的,尽管它毕竟非常简单。
当你执行新的ClassA()时,你将使用你当前所在类的类加载器。这个类加载器知道类A,因为它在同一个包中或者是导入的。如果它在同一个包中,则使用此类加载器。如果它在另一个包中,则将类加载委托给另一个包的类加载器。
因此我们假设A由bundle A的类加载器加载。它需要在导入的包中的B类。因此,B的创建被委托给B的类加载器。 这意味着类B由bundle B的类加载器加载.B中的所有代码都使用类B的类加载器。所以C类的创建也是使用bundle B的类加载器完成的。这就是它运作的原因。