Java類載入器原理解析
1 JVM有三種預定義型別類載入器
啟動類載入器:引導類裝入器是用原生代碼實現的類裝入器,它負責將 <Java_Runtime_Home>/lib下面的核心類庫或-Xbootclasspath選項指定的jar包載入到記憶體中。
擴充套件類載入器:擴充套件類載入器是由Sun的ExtClassLoader實現的。它負責將<Java_Runtime_Home >/lib/ext或者由系統變數-Djava.ext.dir指定位置中的類庫載入到記憶體中。開發者可以直接使用標準擴充套件類載入器。
系統類載入器:系統類載入器是由 Sun的 AppClassLoader實現的。它負責將系統類路徑
java -classpath或-Djava.class.path變數所指的目錄下的類庫載入到記憶體中。開發者可以直接使用系統類載入器。
類載入過程
類從被載入到虛擬機器記憶體中開始,到卸載出記憶體為止,它的整個生命週期包括:載入、驗證、準備、解析、初始化、使用和解除安裝七個階段。它們開始的順序如下圖所示:
其中類載入的過程包括了載入、驗證、準備、解析、初始化五個階段。
2 雙親委派機制
JVM在載入類時預設採用的是雙親委派機制。就是某個特定的類載入器在接到載入類的請求時,首先將載入任務委託給父類載入器,依次遞迴,如果父類載入器可以完成類載入任務,就成功返回;只有父類載入器無法完成此載入任務時,才自己去載入。
類載入器的層次關係如下圖所示:
3 java程式動態擴充套件方式
Java的連線模型允許使用者執行時擴充套件引用程式,既可以通過當前虛擬機器中預定義的載入器載入編譯時已知的類或者介面,又允許使用者自行定義類裝載器,在執行時動態擴充套件使用者的程式。通過使用者自定義的類裝載器,你的程式可以裝載在編譯時並不知道或者尚未存在的類或者介面,並動態連線它們並進行有選擇的解析。