參考文獻:
http://www.cnblogs.com/leesf456/p/5269545.html
http://www.cnblogs.com/doit8791/p/5820037.html
1. 雙親委派模型
從虛擬機角度看,只存在兩種類加載器:1. 啟動類加載器。2. 其他類加載器。從開發人員角度看,包括如下類加載器:1. 啟動類加載器。2. 擴展類加載器。3. 應用程序類加載器。4. 自定義類加載器。
① 啟動類加載器,用於加載Java API,加載<JAVA_HOME>\lib目錄下的類庫。
② 擴展類加載類,由sun.misc.Launcher$ExtClassLoader實現,用於加載<JAVA_HOME>\lib\ext目錄下或者被java.ext.dirs系統變量指定路徑下的類庫。
③ 應用程序類加載器,也成為系統類加載器,由sun.misc.Launcher$AppClassLoader實現,用於加載用戶類路徑(ClassPath)上所指定的類庫。
④ 自定義類加載器,繼承系統類加載器,實現用戶自定義加載邏輯。
各個類加載器之間是組合關系,並非繼承關系。
當一個類加載器收到類加載的請求,它將這個加載請求委派給父類加載器進行加載,每一層加載器都是如此,最終,所有的請求都會傳送到啟動類加載器中。只有當父類加載器自己無法完成加載請求時,子類加載器才會嘗試自己加載。
雙親委派模型可以確保安全性,可以保證所有的Java類庫都是由啟動類加載器加載。如用戶編寫的java.lang.Object,加載請求傳遞到啟動類加載器,啟動類加載的是系統中的Object對象,而用戶編寫的java.lang.Object不會被加載。如用戶編寫的java.lang.virus類,加載請求傳遞到啟動類加載器,啟動類加載器發現virus類並不是核心Java類,無法進行加載,將會由具體的子類加載器進行加載,而經過不同加載器進行加載的類是無法訪問彼此的。由不同加載器加載的類處於不同的運行時包。所有的訪問權限都是基於同一個運行時包而言的。
當一個類加載器收到類加載的請求,它將這個加載請求委派給父類加載器進行加載,每一層加載器都是如此,最終,所有的請求都會傳送到啟動類加載器中。只有當父類加載器自己無法完成加載請求時,子類加載器才會嘗試自己加載。
雙親委派模型可以確保安全性,可以保證所有的Java類庫都是由啟動類加載器加載。如用戶編寫的java.lang.Object,加載請求傳遞到啟動類加載器,啟動類加載的是系統中的Object對象,而用戶編寫的java.lang.Object不會被加載。如用戶編寫的java.lang.virus類,加載請求傳遞到啟動類加載器,啟動類加載器發現virus類並不是核心Java類,無法進行加載,將會由具體的子類加載器進行加載,而經過不同加載器進行加載的類是無法訪問彼此的。由不同加載器加載的類處於不同的運行時包。所有的訪問權限都是基於同一個運行時包而言的。