簡體   English   中英

OSGI類加載和對象共享

[英]OSGI Classloading & Object Sharing

好。 因此,我知道不能將用ClassloaderA實例化的類直接傳遞給ClassloaderB,因為在JVM看來,對象的“類”在不同的類加載器中會有所不同。

我也知道序列化對象以將其發送到ClassloaderB會非常慢,而且我看不到使用此方法的OSGi容器。 如果我有一個將服務導出到BundleB(將其導入服務)的bundleA,並且調用了一個方法“ serviceMethod()”,該方法返回了ObjectA,那么ObjectA如何從BundleA傳遞到BundleB?

謝謝!

如果您將相同的程序包導入兩個捆綁包中,則通常兩個程序包都都連接到該程序包的同一類加載器中。 假設我們有提供服務接口和相關類的包A,提供帶有內部服務impl的服務的包B和使用該服務的包C。

捆綁軟件B將導入服務接口和其他帶有服務類別的軟件包。 因此,如果它從導入的包中對某個類進行了更新,則它將觸發自己的類加載器(B)加載該類。 然后,在導入包時,該類加載器將委派給類加載器A。 因此,有效的服務類將由類加載器A加載。

然后,對捆綁軟件C也是如此,因為導入的公共類也將被委派給類加載器A。因此,兩個捆綁軟件都將能夠使用服務接口和導入的類進行通信。

順便說一句。 您甚至可以傳輸捆綁軟件C未知的對象。例如,捆綁軟件B可以創建一個私有類,並將其作為“對象”返回到服務中。 然后,束C仍可以與該類一起使用並在其上使用反射。 因此無需編組。

OSGi類加載可能會出錯的唯一情況是,例如,捆綁軟件C嵌入了服務接口jarA。然后,這些軟件包將通過類加載器C進行加載。因此,它們將與捆綁軟件B已知的軟件包不同。因此,請避免嵌入如果可能的話。

因為BundleA被定義為依賴BundleA所以與BundleB關聯的類加載器被連接為從BundleA加載類。 因此BundleB可以訪問從BundleA返回的對象的類。

看到:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM