1、啟動類加載器:Bootstrap ClassLoader :加載對象是java核心庫,把一些核心的類加載進(jìn)jvm中,使用原生C/C++實現(xiàn),所有類的加載器的父加載器。無法被java程序使用。
2、擴(kuò)展類加載器:Extension ClassLoader:加載對象為java擴(kuò)展庫,由啟動類加載器加載,getParent()返回null;
3、應(yīng)用程序類加載器:Application ClassLoader:系統(tǒng)類加載器,加載用戶類路徑指定的類庫,程序沒有自定義加載器,為默認(rèn)加載器。父類為擴(kuò)展類加載器;
雙親委托機(jī)制:
一個類加載進(jìn)來,委托給父類加載器加載,父類加載器又嘗試委托給其父類加載器,以此類推,直到父類加載器為啟動類加載器。父類加載器反饋無法加載時,子加載器才會嘗試自己加載。
優(yōu)點:
1、保證java應(yīng)用所使用的都是同一個版本java核心庫的類;
2、保證安全性,啟動類加載器檢查緩存中已經(jīng)有加載的類,不會再次加載外部的類;
全盤負(fù)責(zé)機(jī)制:
一個類加載器加載一個類時,如果沒有顯式指定類加載器,該類所依賴的、引用的其他所有類都由這個類加載器加載;
jvm中,同一個jvm中可以有兩個包名、類名都相同的類,只要他們由兩個不同的類加載器加載。該特征提供了隔離機(jī)制,tomcat的hotswap機(jī)制;
報錯ClassNotFoundException
原因:類加載器加載引用類時,只會向上查找引用類,而不會從子類加載器上查找;
解決方式:
1、用同一個類加載器;
2、a,b兩個類,b類引用a類,a類加載器大于b類的加載器;