虛擬機設計團隊把類加載階段中的,“通過一個類的全限定名來獲取描述該類的二進制字節(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)先級的層次關系。