類加載器

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

類與類加載器:

? 類加載器雖然只用于實現類的加載動作,但它在Java程序中起到的作用卻遠遠不限于類加載階段。對于任意一個類,都需要由加載它的類加載器和這個類本身一同確立其在Java虛擬機中的唯一性,每一個類加載器,都擁有一個獨立的類名稱空間。這句話可以表達得更通俗一點:比較兩個類是否“相等”,只有在這兩個類是由同一個類加載器加載的前提下才有意義,否則,即使這兩個類來源于同一個Class文件,被同一個虛擬機加載,只要加載它們的類加載器不同,那這兩個類就必定不相等。

雙親委派模型:

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

三種系統(tǒng)提供的類加載器:

? -啟動類加載器:Bootstrap ClassLoader,這ClassLoader就是接待室服務自身的,它主要加載JVM自身工作需要的類。這個ClassLoader完全是由JVM自己控制的,需要加載哪個類、怎么加載都是JVM自己控制。

? -擴展類加載器:ExtClassLoader,這個類加載器有點特殊,它是JVM自身的一部分,但是它的血統(tǒng)也不是很純正,它并不是JVM親自實現的,他服務的特定目標在System.getProperty(“java.ext.dirs”)目錄下。

? -應用程序類加載器:AppClassLoader,他負責加載用戶類路徑上所制定的類庫,開發(fā)者可以直接使用這個類加載器,如果應用程序中沒有自定義過自己的類加載器,一般情況下這個就是程序中默認的類加載。


上圖中這種類加載器之間的這種層次關系,稱為類加載器的雙親委派模型。雙親委派模型要求除了頂層的啟動類加載器外,其余的類加載器都應當有自己的父類加載器。這里類加載器之間的父子關系一般不會以繼承的關系來實現,而都是使用組合關系來復用父加載器的代碼。

雙親委派模型的工作過程

如果一個類加載器收到了類加載器請求,他首先不會自己去嘗試加載這個類,而是把這個請求委托給父類加載器去完成,每一個層次的類加載器都是如此,因此所有的加載請求最終都應該傳送到頂層的啟動類加載器,只有當夫加載器反饋自己無法完成這個加載請求時(他的搜索范圍中沒有找到所需的類),子加載器才會嘗試自己去加載。

使用雙親委派模型來組織類加載器之間的關系,有一個顯而易見的好處就是Java類隨著它的類加載器一起具備了一種帶有優(yōu)先級的層次關系。例如,無論哪一個類加載器要加載放在rt.jar目錄下的Java.lang.Object類,最終都是委派給處于模型最頂端的啟動類加載器加載,由各個類加載器自行去加載的話,如果用戶自己編寫了一個稱為Java.lang.Object的類,并放在程序的ClassPath中,那系統(tǒng)中將會出現多個不同的Object類,Java類型體系中最基礎的行為也就無法保證。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容