java classloader雙親委派原則
1.1 class loader
1.1.1 載入器型別
1.1.1.1 bootstrap class loader
引導類載入器/啟動類載入器,用來載入java的核心庫。主要是 jre/lib目錄(來源於環境變數sun.boot.class.path)。其由c++編寫,本身屬於虛擬機器的一部分,無法在java程式碼中獲取它的引用。
列印其啟動的jar:
String[] files = System.getProperty("sun.boot.class.path").split(";");
Arrays.asList(files).forEach(System.out::println);
結果:
C:\Program Files\Java\jdk1.8.0_151\jre\lib\endorsed\rt_debug.jar (自己新增的debug時用於顯示變數的rt.jar)
C:\Program Files\Java\jdk1.8.0_151\jre\lib\resources.jar
C:\Program Files\Java\jdk1.8.0_151\jre\lib\rt.jar
C:\Program Files\Java\jdk1.8.0_151\jre\lib\sunrsasign.jar
C:\Program Files\Java\jdk1.8.0_151\jre\lib\jsse.jar
C:\Program Files\Java\jdk1.8.0_151\jre\lib\jce.jar
C:\Program Files\Java\jdk1.8.0_151\jre\lib\charsets.jar
C:\Program Files\Java\jdk1.8.0_151\jre\lib\jfr.jar
C:\Program Files\Java\jdk1.8.0_151\jre\classes
1.1.1.2 extensions class loader
擴充套件類載入器,用來載入java的擴充套件庫
列印其啟動的jar
String[] extFiles = System.getProperty("java.ext.dirs").split(";");
Arrays.asList(extFiles).forEach(System.out::println);
結果:
C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext
C:\Windows\Sun\Java\lib\ext
1.1.1.3 system class loader/application class loader
系統類載入器
列印其啟動的jar
String[] appFiles = System.getProperty("java.class.path").split(";");
Arrays.asList(appFiles).forEach(System.out::println);
結果:
E:\work_space\Study\target\test-classes
E:\work_space\Study\target\classes
D:\mvn_repositroy\org\slf4j\slf4j-api\1.7.22\slf4j-api-1.7.22.jar
D:\mvn_repositroy\ch\qos\logback\logback-core\1.1.8\logback-core-1.1.8.jar
D:\mvn_repositroy\ch\qos\logback\logback-classic\1.1.8\logback-classic-1.1.8.jar
1.1.1.4 自定義載入器
1.1.2 類載入器之間的關係
除了引導類載入器,所有的類載入器都有一個父類載入器。
預設情況下,開發人員自己編寫的類載入器父類載入器是系統類載入器(除非顯示指定了父類載入器)。可以通過getParent()獲得(除了父類為引導類載入器)。示意圖如下:
1.1.3 雙親委託
java虛擬機器是如何判定兩個class是相同的:不僅要看類的全名是否相同,還要看載入器是否相同。
比如Hello.class是編譯後的位元組碼,如果不自定義載入器,那麼只會載入一次這個class,但是如果自定義了兩個同級classloader,那麼則可以載入兩個class。
雙親委託主要概念見下圖,設計思想主要是避免同一個類被不同的載入器載入,導致額外問題。
載入類之前先看看父類有沒有,沒有的話看看父類能不能載入,父類有的直接複用,父類能載入的自己絕不載入。(自定義類載入器除外,某些時刻屬於定製加功能)
1.1.3.1 示意圖
1.1.4 參考資源
https://blog.csdn.net/briblue/article/details/54973413
https://www.ibm.com/developerworks/cn/java/j-lo-classloader/index.html
https://www.jianshu.com/p/6e5c2b463b2a
備註:圖都是摘錄的,理論上來源於上面三個連結。