類加載器

虛擬機設計團隊把類加載階段中的,“通過一個類的全限定名來獲取描述該類的二進制字節(jié)流”這個動作放到Java虛擬外部去實現(xiàn),以便讓應用程序自己去決定如何去獲取自己所需要的類,實現(xiàn)這個動作的代碼塊就稱作“類加載器”,類加載器可以說是Java語言的一項創(chuàng)新,也是Java語言流行的主要原因之一。

1.類與類加載器

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

1)啟動類加載器(BootStrap ClassLoader)

它負責加載<JAVA_HOME>\lib目錄中的,或者被-Xbootclasspath所指定的路徑中的并且是虛擬機識別的類庫加載到虛擬機內存中,啟動類加載器無法被Java程序直接引用。

2)擴展類加載器(Extension ClassLoader)

它負責加載<JAVA_HOME>\lib\ext目錄中的,或者被java.ext.dirs系統(tǒng)變量所指定的路徑中的所有類庫,開發(fā)者可以直接使用擴展類加載器

3)應用程序類加載器(Application ClassLoader)

一般稱為系統(tǒng)類加載器,它負責加載用戶路徑(ClassPath)上所指定的類庫,開發(fā)者可以直接使用這個類加載器,如果應用程序中沒有定義自己的類加載器,一般情況下這就是默認的類加載器。

2.雙親委派模型

類加載器雙親委派模型

類加載器雙親委派模型除了頂層的類加載器之外,其余的類加載器都應該有自己的父類加載器,這里的類加載器之間的父子關系一般不會以繼承的方式來實現(xiàn),而是以組合的方式來復用父類加載器中的代碼。類加載器的雙親委派模型在JDK1.2期間被引入并被廣泛使用于之后幾乎所有的Java程序中,但它并不是一個強制性的的約束模型,而是Java設計者推薦給程序設計者的一種類加載實現(xiàn)方式。

類加載器雙親委派模型工作過程:如果一個類加載器接收到類加載的請求,首先它不會自己嘗試去加載這個類,而是把這個請求委派給父類加載器去完成,每一個層次的類加載器都是如此,因此所有的類加載請求都會傳送到頂層的啟動類加載器,只有父類反饋自己無法完成這個類加載請求時,子加載器才會自己嘗試去加載。

使用類加載器雙親委派模型來組織類加載器之間的關系,有一個顯而易見的好處就是Java類隨著它的類加載器一起具備了帶優(yōu)先級的層次關系。

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

友情鏈接更多精彩內容