類載入全過程
阿新 • • 發佈:2018-11-12
1、載入
載入時類載入過程的第一個階段,在載入階段,虛擬機器需要完成以下三件事情:
1、通過一個類的全限定名來獲取其定義的二進位制位元組流。
2、將這個位元組流所代表的靜態儲存結構轉化為方法區的執行時資料結構。
3、在Java堆中生成一個代表這個類的java.lang.Class物件,作為對方法區中這些資料的訪問入口。
- 啟動類載入器:Bootstrap ClassLoader,跟上面相同。它負責載入存放在JDK\jre\lib(JDK代表JDK的安裝目錄,下同)下,或被-Xbootclasspath引數指定的路徑中的,並且能被虛擬機器識別的類庫(如rt.jar,所有的java.*開頭的類均被Bootstrap ClassLoader載入)。啟動類載入器是無法被Java程式直接引用的。
- 擴充套件類載入器:Extension ClassLoader,該載入器由sun.misc.Launcher$ExtClassLoader實現,它負責載入JDK\jre\lib\ext目錄中,或者由java.ext.dirs系統變數指定的路徑中的所有類庫(如javax.*開頭的類),開發者可以直接使用擴充套件類載入器。
- 應用程式類載入器:Application ClassLoader,該類載入器由sun.misc.Launcher$AppClassLoader來實現,它負責載入使用者類路徑(ClassPath)所指定的類,開發者可以直接使用該類載入器,如果應用程式中沒有自定義過自己的類載入器,一般情況下這個就是程式中預設的類載入器。
2、驗證
下四個階段的驗證:檔案格式的驗證、元資料的驗證、位元組碼驗證和符號引用驗證。
比如啟動專案時 UTF-8報錯,編譯報錯,命名相同報錯 等等
3、準備
將變數在記憶體中生成並且給個預設初始(static除外 static修飾的欄位是什麼初始值就是什麼)
4、解析
從上到下執行程式碼解析
5、初始化
chind()方法是程式初始化的核心,上面4步執行完畢後才會初始化,只有初始化後類 物件 屬性 才會被應用。
總結
整個類載入過程中,除了在載入階段使用者應用程式可以自定義類載入器參與之外,其餘所有的動作完全由虛擬機器主導和控制。到了初始化才開始執行類中定義的Java程式程式碼(亦及位元組碼),但這裡的執行程式碼只是個開端,它僅限於<clinit>()方法。類載入過程中主要是將Class檔案(準確地講,應該是類的二進位制位元組流)載入到虛擬機器記憶體中,真正執行位元組碼的操作,在載入完成後才真正開始。