2012-08-26 65 views
2

類加載器是分層結構的。子類加載器要求父類加載類,如果父類無法通過維護唯一性來加載類。所有父類加載的類都可以被子類加載器訪問,但相反的是不正確的。在我的腦海裏出現了問題:孩子要求父母加載課程,但由於某些問題,父母無法加載,因此孩子將其加載到JVM中。在稍後的某個時間點,父級需要該類,明顯的父級無法查看JVM中加載了哪些子類加載器的類,那麼父級是否也會將該類加載到JVM中?同一班的獨特性會怎樣?問題如何解決?任何好的指針,將不勝感激。Java中的類加載器

回答

2

父母無法加載,那麼孩子將其加載在JVM

父母可能不能夠由於類加載到兩方面的原因:類實體上沒有發現或者預期某些暫時性失敗。在前一種情況下,ClassLoader將拋出一個ClassNotFoundException,這將永遠不會改變。在後者中,會從父項中拋出不同的異常,從而中斷子類加載器。所以這種情況絕不會發生。

同一類的獨特性會發生什麼?

在此情況下,但在技術上這是可能的,尤其是在複雜的類加載器層次的應用服務器。基本上兩個類加載器可以加載相同的類,它們是不兼容的(您可以獲得ClassCastException)。

0

在你的情況下,JVM中將會有兩個具有相同名稱但不同Class實例的類。這些類在所有方面都被認爲是不同的。當您嘗試分配引用「跨類加載器」,那麼你會得到一個錯誤時拋出像

Cannot cast class Foo to class Foo 

這不是一個理論問題 - 這種例外的是看到飄飛在Java EE/EJB域。

0

的類是平等的必須是在等於以下所有: 1.類的名稱應該是包裝的相同 2.名稱應該是加載類相同 3.類加載器必須是相同的。

所以沒有被相同的classLoader加載的類不是同一個類! 通過這種方式,您可以在同一個應用程序服務器中導入兩個不同版本的jar,這由不同的classLoaders完成。

希望它有幫助...