類加載器介紹
類加載器種類
-
啓動類加載器(也叫引導類加載器。Bootstrap):這個類加載器負責放在<JAVA_HOME>\lib目錄中的,或者被-Xbootclasspath參數所指定的路徑中的,並且是虛擬機識別的類庫。負責加載jre的核心類庫,如jre目標下的rt.jar等等,用戶無法直接使用。
Bootstrap類加載器沒有任何父類加載器,如果你調用String.class.getClassLoader(),會返回null,任何基於此的代碼會拋出NUllPointerException異常。Bootstrap加載器被稱爲初始類加載器。 -
擴展類加載器(Extension):這個類加載器由sun.misc.Launcher$ExtClassLoader實現。它負責<JAVA_HOME>\lib\ext目錄中的,或者被java.ext.dirs系統變量所指定的路徑中的所有類庫。用戶可以直接使用。
-
應用程序類加載器(Application):這個類由sun.misc.Launcher$AppClassLoader實現。是ClassLoader中getSystemClassLoader()方法的返回值。它負責用戶路徑(ClassPath)所指定的類庫。用戶可以直接使用。如果用戶沒有自己定義類加載器,默認使用這個。
-
自定義加載器:用戶自己定義的類加載器。
代碼示例:
package test;
public class TestJDKClassLoader {
public static void main(String[] args) {
System.out.println(String.class.getClassLoader());
System.out.println(com.sun.crypto.provider.DESKeyFactory.class.getClassLoader().getClass().getName());
System.out.println(TestJDKClassLoader.class.getClassLoader().getClass().getName());
System.out.println(ClassLoader.getSystemClassLoader().getClass().getName());
}
}
TestJDKClassLoader運行結果:
null
sun.misc.Launcher$ExtClassLoader
sun.misc.Launcher$AppClassLoader
sun.misc.Launcher$AppClassLoader
類加載機制
類加載機制分爲:雙親委派機制和全盤負責委託機制。
雙親委派機制
含義
當需要加載一個類的時候,子類加載器並不會馬上去加載,而是依次去請求父類加載器加載,一直往上請求到最高類加載器:啓動類加載器。當啓動類加載器加載不了的時候,依次往下讓子類加載器進行加載。當達到最底下的時候,如果還是加載不到該類,就會出現ClassNotFound的情況。
注意:父類加載器和子類加載器不同於ava代碼中父類子類的關係,不是繼承製,而是AppClassLoader中有一個ExtClassLoader的引用,
好處:
- 沙箱安全機制:保證了程序的安全性。
例子:比如我們重新寫了一個String類,加載的時候並不會去加載到我們自己寫的String類,因爲當請求上到最高層的時候,啓動類加載器發現自己能夠加載String類,因此就不會加載到我們自己寫的String類了。 - 避免重複加載。父類加載器加載後子類加載器就不會加載。
全盤負責委託機制
含義
“全盤負責”是指當一個ClassLoader裝載一個類時,除非顯示地使用另一個ClassLoader,則該類所依賴及引用的類也由這個CladdLoader載入。
例如:系統類加載器AppClassLoader加載入口類(含有main方法的類)時,會把main方法所依賴的類及引用的類也載入,依此類推。“全盤負責”機制也可稱爲當前類加載器負責機制。顯然,入口類所依賴的類及引用的類的當前類加載器就是入口類的類加載器。
劃重點(∩_∩)
本人程序媛一枚,因爲離港澳較近,週末兼職港澳人肉代購。
歡迎各位大佬添加本人微信,還會經常有點贊活動送價值不菲的小禮品哦。
即使現在不需要代購,等以後有了女(男)朋友、有了寶寶就肯定會需要的嘍。
動動手指頭,掃碼一下,就當是對本博文的支持嘛,也是對一個平凡、勤勞、勇敢、秀外慧中等等優點的程序媛莫大的支持哈。