啓動類加載器 Bootstrap ClassLoader:加載<JAVA_HOME>\lib目錄下核心庫
擴展類加載器 Extension ClassLoader:加載<JAVA_HOME>\lib\ext目錄下擴展包
應用程序類加載器 Application ClassLoader: 加載用戶路徑(classpath)上指定的類庫
雙親委派模型
雙親委派模型要求除頂層啓動類加載器外其餘類加載器都應該有自己的父類加載器;類加載器之間通過複用關係來複用父加載器的代碼。
雙親委派模型工作工程:
1.當Application ClassLoader 收到一個類加載請求時,他首先不會自己去嘗試加載這個類,而是將這個請求委派給父類加載器Extension ClassLoader去完成。
2.當Extension ClassLoader收到一個類加載請求時,他首先也不會自己去嘗試加載這個類,而是將請求委派給父類加載器Bootstrap ClassLoader去完成。
3.如果Bootstrap ClassLoader加載失敗(在<JAVA_HOME>\lib中未找到所需類),就會讓Extension ClassLoader嘗試加載。
4.如果Extension ClassLoader也加載失敗,就會使用Application ClassLoader加載。
5.如果Application ClassLoader也加載失敗,就會使用自定義加載器去嘗試加載。
6.如果均加載失敗,就會拋出ClassNotFoundException異常。
雙親委派模型的實現過程:
實現雙親委派模型的代碼都集中在java.lang.ClassLoader的loadClass()方法中:
首先會檢查請求加載的類是否已經被加載過;
若沒有被加載過:
遞歸調用父類加載器的loadClass();
父類加載器爲空後就使用啓動類加載器加載;
如果父類加載器和啓動類加載器均無法加載請求,則調用自身的加載功能。
雙親委派模型的優點:
Java類伴隨其類加載器具備了帶有優先級的層次關係,確保了在各種加載環境的加載順序。 保證了運行的安全性,防止不可信類扮演可信任的類。
原文地址: http://blog.csdn.net/inspiredbh/article/details/74889654