https://crowhawk.github.io/2017/08/21/jvm_6/
類的加載器:每個類和對應(yīng)的類加載器在虛擬機(jī)中都具有唯一性,也就是說不同的類加載器根據(jù)同個class文件加載出來的兩個個類.算不同的兩個類.
加載機(jī)制:雙親委托機(jī)制:在類加載器中只分成兩種類加載器.一種是由c++寫的BootstrapClassload.和其他的由java語言寫的類加載器.全都繼承與ClassLoad類
如果由開發(fā)人員來劃分類別:
1:啟動類加載器Bootstrap Classload.無法用java代碼直接引用.需要吧加載請求委托給引導(dǎo)類加載器.直接用null來代替
2:擴(kuò)展類加載器:Extension Classload. 開發(fā)者可以直接使用
3:應(yīng)用程序類加載器:Application Classload(系統(tǒng)類加載器).有ClassLoad中的getSystemClassLoad的返回值.負(fù)責(zé)加載用戶類路徑上的類庫.一般默認(rèn)的加載器就是這個
雙親委托加載過程:當(dāng)類加載器接到一個類的加載請求,先把委托給父類加載器去完成.一層一層往上.如果最上層的加載器表示加載不了.則返回給下一級去加載.(bootStrap Classload不是Extension Classload的父類加載器.他的父類加載器是null.當(dāng)父類加載器為null時.會用啟動類加載器)
破壞雙親委托加載機(jī)制:
并不是所有的加載都是雙親委托加載機(jī)制的;
1:在這個機(jī)制之前出現(xiàn)的有一些是用自定義的加載器加載的.(所以只能加一個方法findClass().這個方法唯一的作用就是地調(diào)用loadClass())
2:越基礎(chǔ)的類由越基礎(chǔ)的加載器加載.如果基礎(chǔ)類需要調(diào)用用戶代碼時.JNDI(對資源進(jìn)行集中管理和查找)? 解決(線程上下文類加載器)如果創(chuàng)建線程是,還沒加載,會調(diào)用父類加載器加載.如果在應(yīng)用程序的全局范圍內(nèi)都沒有設(shè)置過的話,那這個類加載器默認(rèn)為Application Classload
3:對動態(tài)化程序的追求:不停機(jī)更新:基本都在平級類加載器中查找