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

OSGI: How object is created if used classes are in private packages

假设我们有两个包 A 和 B。

捆绑一个私有包:

class ClassA extends ClassB{}

Bundle B - 导出包:

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

Bundle B - 私有包:

class ClassC{}

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

很好的问题。实际上我花了几年时间才弄明白它是如何工作的,尽管它毕竟很简单。

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

所以我们假设 A 是由包 A 的 classloader 加载的。它需要 class B,它在一个导入的包中。所以B的创建委托给了B的classloader。 这意味着 class B 由 bundle B 的 classloader 加载。B 中的所有代码都使用 class B 的 classloader。因此 [=16= 的创建] C 也是使用 bundle B 的 classloader 完成的。这就是它起作用的原因。