OSGI:如果使用的类在私有包中,则如何创建对象

时间:2016-06-18 10:22:06

标签: java osgi

假设我们有两个捆绑包A和B.

捆绑私人包裹:

class ClassA extends ClassB{}

捆绑B - 导出包:

class ClassB{
  private ClassC classC=new ClassC();
}

捆绑B - 私人包裹:

class ClassC{}

当我在bundle A中创建ClassA的实例时,它已成功创建。但为什么?我们确实需要ClassC,但捆绑A类加载器并没有看到它。

1 个答案:

答案 0 :(得分:4)

非常好的问题。它实际上花了我几年时间,直到我弄清楚它是如何工作的,尽管它毕竟非常简单。

当你执行新的ClassA()时,你将使用你当前所在类的类加载器。这个类加载器知道类A,因为它在同一个包中或者是导入的。如果它在同一个包中,则使用此类加载器。如果它在另一个包中,则将类加载委托给另一个包的类加载器。

因此我们假设A由bundle A的类加载器加载。它需要在导入的包中的B类。因此,B的创建被委托给B的类加载器。 这意味着类B由bundle B的类加载器加载.B中的所有代码都使用类B的类加载器。所以C类的创建也是使用bundle B的类加载器完成的。这就是它运作的原因。