java類加載器,雙親委派模型

什麼是類加載器:

虛擬機設計團隊把類加載階段中的“通過一個類的全限定名來獲取描述此類的二進制字節流”這個動作放到Java虛擬機外部去實現,以便讓應用程序自己決定如何去獲取所需要的類。實現這個動作的代碼模塊稱爲“類加載器”。


類與類加載器的關係:

對於任意一個類,都需要由加載它的類加載器和這個類本身一同確立其在java虛擬機中的唯一性,每一個類加載器,都擁有一個獨立的類名稱空氣。要比較兩個類是否相等,只有在這兩個類是由同一個類加載器加載的前提下才有意義。而無論這兩個類是否源於同一個Class文件以及是否被同一個虛擬機加載。這裏的相等包括類的Class對象的equals()方法,isAssignableFrom()方法、isInstance()方法的返回結果,也包括使用instanceof關鍵字做對象所屬關係判定等情況


什麼是雙親委派模型:

從java虛擬機的角度來講,只存在兩種不同的類加載器:啓動類加載器(Bootstrap ClassLoader),這個類加載器使用C++語言實現,是虛擬機自身的一部分;另一種就是所有其他的類加載器,這些類加載器都由java語言實現,獨立於虛擬機外部,並且全都繼承自抽象類java.lang.ClassLoader。

從java開發人員的角度,絕大部分java程序 都會使用以下3種系統提供的類加載器。

啓動類加載器: 這個類加載器負責將存放在<JAVA_HOME>\lib目錄中的,或者被-X bootclasspath參數所指定的路徑中的,並且是虛擬機識別的(僅按照文件名稱識別,如rt.jar,名稱不符合的類庫即使放在lib目錄中也不會加載)類庫加載到虛擬機內存中。不可直接使用。

擴展類加載器:由sun.misc.Launcher$ExtClassLoader實現,負責加載<JAVA_HOME>\lib\ext目錄中的,或者被java.ext.dirs系統變量所指定的路徑中的所有類庫,可直接使用

應用程序類加載器:由sun.misc.Launcher$App-ClassLoader實現。負責加載用戶類路徑(ClassPath)上所指定的類庫,如果應用程序中沒有自定義類加載器,一般情況下默認該加載器


圖 1-1

類加載器間的關係如圖1-1所示,上層的加載器稱爲下層加載器的父類加載器,除了啓動類加載器外的其他類加載器都應該有自己的父類加載器,它們之間的父子關係一般不以繼承關係來實現,而是使用組合。

雙親委派模型的工作過程是:當一個類加載器收到類加載的請求時,首先不會自己加載,而是會先委派給父類加載器去加載,每一層都如此,因此所有的加載請求最終都 會傳遞到頂層的啓動類加載器,只有當父類加載器反饋自己無法完成這個加載請求時,子 加載器纔會嘗試自己去加載。好處是java類隨着它的類加載器一起具備了一種帶有優先級的層次關係,例如java.lang.Object,它存放於rt.jar之中,無論哪個類加載器要加載這個類,最終都會委派爲處於模型最頂端的啓動類加載器進行加載,因此Object類在程序的各種類加載器環境中都是同一個類。

需要注意的是雙親委派模型並不是一個強制性的約束模型,而是java設計者推薦給開發者的一種類加載器實現方式。






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章