?類加載器
1.什么是類加載器?
- 啟動類加載器(Bootstrap ClassLoader):這是JVM自帶的類加載器,負責加載Java的核心類庫,如rt.jar等。由于安全原因,啟動類加載器加載的類不能被其他類加載器加載的類所引用。
- 擴展類加載器(Extension ClassLoader):負責加載Java的擴展類庫,一般位于$JAVA_HOME/jre/lib/ext目錄下。
- 系統類加載器(System ClassLoader):也稱為應用類加載器(Application ClassLoader),它負責加載應用程序的類路徑(classpath)下的所有類。
- 自定義類加載器:開發者可以通過繼承
java.lang.ClassLoader
類來自定義類加載器,以滿足特殊需求,如熱部署、代碼加密等。
2.什么是雙親委派機制?
????????Java的類加載器采用雙親委派模型(Parent Delegation Model)。
????????當一個類加載器收到類加載請求時,它首先不會自己去嘗試加載這個類,而是把這個請求委派給父類加載器去完成。每一個層次的類加載器都是如此,因此所有的加載請求最終都應該傳送到頂層的啟動類加載器中。只有當父類加載器無法完成這個加載請求(它的搜索范圍中沒有找到所需的類)時,子類加載器才會嘗試自己去加載。
舉個例子:如圖
????????1.Student類:這是一個我們自己加載的類。一開始準備在AppClassLoader加載,但它先不加載,它委托給它的上級加載器ExtClassLoader加載,然后ExtClassLoader繼續向上委托。但Student類不在JAVA_HOME/jre/lib目錄或JAVA_HOME/jre/lib/ext目錄下,因此這兩個加載器都不會加載Student類。這時候才會由AppClassLoader加載。
? ? ? ? 2.String類:同上,它會從AppClassLoader一路向上委托,因為String類在JAVA_HOME/jre/lib目錄中,因此BootStrapClassLoader就會加載String類。
JVM為什么采用雙親委派機制?