2014-09-23 147 views

回答

0

鑑於一個類由類名和加載該類的類加載器唯一標識的事實,parentchild1必須由bundle_1的類加載器加載。 child2將由bundle_2的類加載器加載。

+0

但child2的超級構造函數將在bundle_1上調用? – gstackoverflow 2014-09-23 17:11:52

+0

您的問題未提供足夠的信息。這些類包含哪些包?捆綁包實際導出和導入了哪些包?另外,調用意味着你正在討論線程。線程不屬於捆綁。 – 2014-09-23 23:10:29

+0

@gstackoverflow:構造函數調用實際上與類加載的關係有限。你需要澄清你的意思「child2的超級構造函數將在bundle_1上調用」還是更好:你首先提出問題的理由。 – 2014-09-24 06:58:55

1

在OSGi中,每個bundle都有一個ClassLoader。加載類時,ClassLoader將首先查看該包的Import-Package語句。如果類來自導入的包,則將加載委託給提供該包的包的ClassLoader。如果沒有這些匹配,那麼捆綁將嘗試從它自己的類中加載類。 (這是簡化了一點,但應該足夠你的情況)。

所以父類和child1類將由bundle_1的ClassLoader加載,並且child2將由bundle_2的ClassLoader加載。

還有一件事要記住。 Java中的每個類都存儲在「class」.getClassLoader()中創建此類的ClassLoader。所以這可以讓你輕鬆檢查真正發生的事情。只需實例化child1和child2並打印ClassLoaders。

與此相關的另一件事是,如果您在類A的代碼中使用新的「Classname」(),那麼這將觸發加載類A的ClassLoader(當然可以委派它)。

+0

父類是否會加載兩次? – gstackoverflow 2014-09-24 19:05:08

+0

否。當類加載委派時,bundle1的類加載器將知道它已經加載了父類。 – 2014-09-25 16:43:52