最近在看《深入理解java虛擬機(jī)》這本書,看到類加載這章時,感覺之前對類加載的理解還不是很深,尤其是雙親委派模型,這里總結(jié)下自己對這個模型的理解。
雙親委派模型

image.png
借用一下類加載中的雙親委派模型圖。
從java虛擬機(jī)的角度,存在三種系統(tǒng)提供的類加載器。
- 引導(dǎo)類加載器(Bootstrap Classloader)
負(fù)責(zé)加載<JAVA-HOME>\lib目錄中的類庫到虛擬機(jī)內(nèi)存中。 - 擴(kuò)展類加載器(Extension Classloader)
負(fù)責(zé)加載<JAVA-HOME>\lib\ext 目錄中的類庫到虛擬機(jī)內(nèi)存中。 - 系統(tǒng)類加載器(Application Classloader)
負(fù)責(zé)加載用戶類路徑上所指定的類庫,可以直接使用這個類加載器,也可自定義自己的類加載器。
雙親委派模型的工作過程是:如果一個類加載器收到了類加載的請求,它首先不會自己去嘗試加載這個類,而是把這個請求委派給父類加載器去完成,每一個層次的類加載器都是如此,只有當(dāng)父類加載器無法完成加載時,子加載器才會嘗試自己去加載。
首先,以ClassA這個用戶自定義類為例說明整個加載過程,假如開發(fā)人員自定義了一個類加載器A用來加載ClassA,類加載器A加載這個類時,首先判斷這個類是否已經(jīng)被加載,然后通知類加載A的父類系統(tǒng)類加載器去加載,系統(tǒng)類加載器也是重復(fù)這個過程,通過這個過程,保證在一個類加載器中,同一個類不會被重復(fù)加載。
另外,如果用戶自己編寫了一個java.lang.Object的類,利用雙親委派模型的話,就能保證Object類的加載最終都會委派給處于模型最頂端的啟動類加載器進(jìn)行加載,保證java最基礎(chǔ)的行為,避免應(yīng)用程序變得一片混亂。
最后,要注意一點(diǎn)的是,Java 虛擬機(jī)是如何判定兩個 Java 類是相同的。Java 虛擬機(jī)不僅要看類的全名是否相同,還要看加載此類的類加載器是否一樣。只有兩者都相同的情況,才認(rèn)為兩個類是相同的。即便是同樣的字節(jié)代碼,被不同的類加載器加載之后所得到的類,也是不同的。