有人可以澄清一下,類加載器的作用不僅是加載一個單獨的類,而且它的依賴關係?如果是這樣,整個過程到底具體到底是什麼?如果可能,我正在尋找實施細節。Java類加載器和依賴關係解析
例如,在某些時候,必須從某處(網絡或文件系統位置)讀取字節,並且文件系統位置將必須根據類規範名稱和對JVM可用的類路徑的預知 - 單個ClassLoader如何嘗試通過潛在的多個類路徑定位文件?它從哪裏獲得這些信息?另外,什麼時候驗證類文件字節並檢查它的依賴關係的可用性?
儘可能詳細地將不勝感激:)
有人可以澄清一下,類加載器的作用不僅是加載一個單獨的類,而且它的依賴關係?如果是這樣,整個過程到底具體到底是什麼?如果可能,我正在尋找實施細節。Java類加載器和依賴關係解析
例如,在某些時候,必須從某處(網絡或文件系統位置)讀取字節,並且文件系統位置將必須根據類規範名稱和對JVM可用的類路徑的預知 - 單個ClassLoader如何嘗試通過潛在的多個類路徑定位文件?它從哪裏獲得這些信息?另外,什麼時候驗證類文件字節並檢查它的依賴關係的可用性?
儘可能詳細地將不勝感激:)
類加載是非常複雜的主題。 ClassLoader和Java安全模型密不可分。本質上,JVM按需加載類。當有類加載器的層次結構時,JVM嘗試將該類儘可能地分解到儘可能遠的鏈中。簡而言之,如果類在「引導」類加載器和應用程序定義的類加載器中定義,它將始終使用引導類加載器中的版本。
在類加載器(例如URLClassLoader)中,搜索順序是您告訴它查找的順序。基本上,你告訴它有URL的URL數組將從第一個入口到最後一個搜索。
當您定義的類引用另一個類時,該類也使用相同的算法解析。但這裏有一個問題:它只能解決它相對於它被發現的地方。讓我們來看一下SomeCoolThing類在引導類加載器中的場景,但依賴於應用程序定義的類加載器中的SomeLameThing。過程是這樣的:
App-ClassLoader: resolveClass("SomeCoolThing")
parent->resolveClass("SomeCoolThing")
Boot-ClassLoader (the ultimate parent): resolveClass("SomeCoolThing")
SomeCoolThing needs SomeLameThing
resolveClass("SomeLameThing") // Can't find SomeLameThing!!!!
即使SomeLameThing是在你要求SomeCoolThing的類加載器,SomeCoolThing在不同的類加載器就解決了。其他類加載器不知道子類加載器,並嘗試自行解析並失敗。
很久以前,我有一本書深入介紹了Java ClassLoaders,我推薦它。它是Java Security by O'Reilly Media。它會回答你從來不想知道的每一個問題,但在處理ClassLoaders及其工作方式時仍然需要。
我可以回答大家的一些問題:
如何一個人的ClassLoader嘗試 查找文件超過潛在 多個類路徑?
如果您的意思是不同的類加載器具有不同的類路徑,那麼每個類加載器將獲取父類加載器的屬性(即類路徑)。所有的東西都是相同的,每個類加載器都有相同的類路徑(我相信;不知道JVM是否會在內部做任何奇怪的事情)。所以MyClass.class對於類加載器和所有子類加載器都是一樣的。如果您在同一個類路徑中定義了多個MyClass.class,那麼JVM會選取第一個。在過去,我創建了自己的類加載器,並將自定義類路徑添加到現有類路徑中,以便在運行時加載不在類路徑中的類時啓動。
得到它的堅果和螺栓我敢肯定,有一個規格說明了這一點,或者你可以下載JVM代碼(彙編/ C/C++代碼),雖然如此,但我已經必須這樣做,「這不是很好」。
當然,「他們」正在改變classpath中的東西,在1.7,所以我不知道如何去上班......
希望幫助有點...
感謝您的反饋,並且正面向上修改1.7-我會考慮它:) – VLostBoy 2010-12-18 10:34:55
說「它將始終使用引導類加載器中的版本」並不十分準確 - 使用任何父類加載器,包括引導加載器依賴於子類加載器正確地委託給他們的父 - 作爲一個實驗,我曾故意違反了這一點,並加載了引導加載器可以在子加載器中找到的類(儘管請注意,總體而言,這樣做效果不佳)。 – 2010-12-17 19:17:32
我做了同樣的實驗並得到了相同的結果。我描述了類加載系統的設計工作方式 - 簡而言之。我參考的這本書將澄清我必須刷新的任何細節。 – 2010-12-17 19:19:20
感謝Berin,這正是我正在尋找的信息水平,並且我一定會檢查出這本書:)。 但是如果我可能更麻煩一點 - 從源代碼到運行時命名空間的類的實際引入發生在哪裏? ClassLoaders會在解析過程中將源代碼編譯爲字節碼嗎?再次感謝! – VLostBoy 2010-12-18 10:32:49