-
類(lèi)加載器(ClassLoader)
- 啟動(dòng)類(lèi)加載器(Bootstrap ClassLoader)
- 擴(kuò)展類(lèi)加載器(Extension ClassLoader)
- 應(yīng)用程序類(lèi)加載器(Application ClassLoader)
每個(gè)類(lèi)加載器都有一個(gè)父加載器(parent)技健;
父加載器不是父類(lèi),可以用getParent()獲榷韫啊雌贱;
-
如果一個(gè)ClassLoader創(chuàng)建時(shí)如果沒(méi)有指定parent,那么它的parent默認(rèn)就是AppClassLoader偿短;
- AppClassLoader的parent是ExtClassLoader欣孤;
- ExtClassLoader的parent是null;
-
Bootstrap ClassLoader
Bootstrap ClassLoader是由C/C++編寫(xiě)的昔逗,它本身是虛擬機(jī)的一部分降传,所以它并不是一個(gè)JAVA類(lèi),也就是無(wú)法在java代碼中獲取它的引用勾怒,JVM啟動(dòng)時(shí)通過(guò) Bootstrap類(lèi)加載器加載rt.jar等核心jar包中的class文件婆排,int.class,String.class都是由它加載。Bootstrap沒(méi)有父加載器笔链,但是它卻可以作為一個(gè)ClassLoader的父加載器泽论,比如ExtClassLoader。
如果要把加載請(qǐng)求委派給Bootstrap ClassLoader卡乾,那直接使用null代替即可翼悴;
-
雙親委派機(jī)制
- 當(dāng)AppClassLoader加載一個(gè)class時(shí),它首先不會(huì)自己去嘗試加載這個(gè)類(lèi)幔妨,而是把類(lèi)加載請(qǐng)求委派給父類(lèi)加載器ExtClassLoader去完成鹦赎。
- 當(dāng)ExtClassLoader加載一個(gè)class時(shí),它首先也不會(huì)自己去嘗試加載這個(gè)類(lèi)误堡,而是把類(lèi)加載請(qǐng)求委派給BootStrapClassLoader去完成古话。
- 如果BootStrapClassLoader加載失敗(例如在$JAVA_HOME/jre/lib里未查找到該class)锁施,會(huì)使用ExtClassLoader來(lái)嘗試加載陪踩;
- 若ExtClassLoader也加載失敗杖们,則會(huì)使用AppClassLoader來(lái)加載,如果AppClassLoader也加載失敗肩狂,則會(huì)報(bào)出異常ClassNotFoundException摘完。
- 雙親委派機(jī)制可以保證安全性,防止系統(tǒng)類(lèi)被偽造
加載Class過(guò)程傻谁,委托是從下向上孝治,然后具體查找Class過(guò)程卻是自上至下。(loadClass()方法的代碼實(shí)現(xiàn))
findClass()
// 查找class并加載审磁;
findClass(){
// 將class二進(jìn)制內(nèi)容轉(zhuǎn)換成Class對(duì)象
defineClass()
}
參考:
- https://blog.csdn.net/Chen4852010/article/details/122546415
- 《深入理解Java虛擬機(jī) 第二版》