OSGI Classloading&对象共享

时间:2014-03-22 01:08:21

标签: java osgi classloader

确定。所以我知道用ClassloaderA实例化的类不能直接传递给ClassloaderB,因为在JVM的眼中," class"对象在不同的​​类加载器中会有所不同。

我也知道序列化对象以将其发送到ClassloaderB将非常慢,我无法使用此方法查看OSGi容器。如果我有一个bundleA,它将服务导出到BundleB(导入服务)和方法" serviceMethod()"调用它返回一个ObjectA,ObjectA如何从BundleA传递给BundleB?

谢谢!

2 个答案:

答案 0 :(得分:1)

如果您在两个软件包中导入相同的软件包,那么通常两个软件包都连接到此软件包的同一个类加载器。 让我们假设我们有捆绑A提供服务接口和关联类,捆绑B为服务提供内部服务impl和捆绑C使用该服务。

Bundle B将使用该服务的类导入服务接口和其他包。因此,如果它从导入的包中对类执行了新操作,那么它将触发自己的类加载器(B)来加载类。然后,在导入包时,此类加载器将委托给类加载器A.因此,有效的服务类将由类加载器A加载。

同样适用于bundle C,因为公共类也被导入加载将被委托给classloader A.所以这两个bundle都能够使用服务接口和导入的类进行通信。

顺便说一下。您甚至可以将未知的对象传输到bundle C.例如,bundle B可以创建一个私有类,并在服务中将其作为“Object”返回。然后捆绑C仍然可以使用该类并在其上使用反射。所以不需要编组。

OSGi类加载可能出错的唯一情况是,例如,bundle C嵌入了服务接口jar A.然后这些包将加载classloader C.所以它们将与已知的bundle B不同。所以保持如果可能的话,远离嵌入。

答案 1 :(得分:0)

BundleB关联的类加载器连接到BundleA的加载类,因为BundleA被定义为依赖项。因此BundleB可以访问从BundleA返回的对象类。

请参阅: