類加載順序
加載 —> 連接(驗證,準備,解析) —> 初始化 —> 使用 —> 卸載;
加載,驗證,準備,初始化,卸載 這五個步驟是確定的,解析階段則不一定,某些情況下它會在初始化後纔開始,主要是爲了支持Java的運行時綁定;
類初始化時機
什麼時候進行類加載的第一階段(加載),JVM規範中並沒有強制約束,這點交給具體的JVM實現來決定。但是對於什麼時候執行類初始化階段,JVM規範做出了嚴格規定,遇到以下五種情況必須初始化類(達到可使用狀態):
- new一個對象,調用某個類的靜態方法,靜態變量,final static變量除外(編譯時候就把結果放到常量池裏);
- reflect反射調用;
- 初始化一個類,父類還沒初始化,會對父類進行初始化;
- JVM啓動時初始化main主類;
- methodHandle解析時,對該方法對應的類進行初始化;
被動引用
被動引用的時候是不會進行初始化的,有以下幾種情況:
- 通過子類調用父類的靜態變量,子類不會被初始化,但會被加載;
- 創建一個對象的數組,對象不會被初始化,但會被加載;
- 調用一個類中的常量(final static修飾),該類不會被初始化,也不會被加載;
查看類加載的JVM參數
-XX:+TraceClassLoading