Bootstrap ClassLoader/啟動類加載器
主要負責jdk_home/lib目錄下的核心 api 或 -Xbootclasspath 選項指定的jar包裝入工作。
Extension ClassLoader/擴展類加載器
主要負責jdk_home/lib/ext目錄下的jar包或 -Djava.ext.dirs 指定目錄下的jar包裝入工作。
System ClassLoader/系統(tǒng)類加載器
主要負責java -classpath/-Djava.class.path所指的目錄下的類與jar包裝入工作。
User Custom ClassLoader/用戶自定義類加載器(java.lang.ClassLoader的子類)
在程序運行期間, 通過java.lang.ClassLoader的子類動態(tài)加載class文件, 體現(xiàn)java動態(tài)實時類裝入特性。
類加載器的特性:
每個ClassLoader都維護了一份自己的名稱空間, 同一個名稱空間里不能出現(xiàn)兩個同名的類。
為了實現(xiàn)java安全沙箱模型頂層的類加載器安全機制, java默認采用了 " 雙親委派的加載鏈 " 結構。
類圖中, BootstrapClassLoader是一個單獨的java類, 其實在這里, 不應該叫他是一個java類。因為,它已經(jīng)完全不用java實現(xiàn)了。它是在jvm啟動時, 就被構造起來的, 負責java平臺核心庫。
自定義類加載器加載一個類的步驟
ClassLoader 類加載邏輯分析, 以下邏輯是除 BootstrapClassLoader 外的類加載器加載流程:
// 檢查類是否已被裝載過
Class c = findLoadedClass(name);
if (c == null ) {
// 指定類未被裝載過
try {
if (parent != null ) {
// 如果父類加載器不為空, 則委派給父類加載
c = parent.loadClass(name, false );
} else {
// 如果父類加載器為空, 則委派給啟動類加載加載
c = findBootstrapClass0(name);
}
} catch (ClassNotFoundException e) {
// 啟動類加載器或父類加載器拋出異常后, 當前類加載器將其
// 捕獲, 并通過findClass方法, 由自身加載
c = findClass(name);
}
}
相關推薦:計算機等考JAVA:讀取Properties文件六種方法北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |