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 完成的。这就是它起作用的原因。
假设我们有两个包 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 完成的。这就是它起作用的原因。