Class 對象。<clinit>()(靜態變量賦值、靜態代碼塊),此階段才真正執行 Java 代碼。Class 對象訪問類。驗證+準備+解析 = 連接階段。
new、getstatic、putstatic、invokestatic 字節碼指令(即 new 對象、讀/寫靜態字段、調用靜態方法)。Class.forName()、Method.invoke() 等。main())。MethodHandle/invokedynamic 涉及的類。| 加載器 | 實現語言 | 加載範圍 |
|---|---|---|
| 啟動類加載器 | C++ | <JAVA_HOME>/lib、-Xbootclasspath 指定路徑 |
| 擴展類加載器 | Java | <JAVA_HOME>/lib/ext、java.ext.dirs |
| 應用程序類加載器 | Java | Classpath (-cp) |
委派流程:子加載器收到請求 → 委派給父加載器 → 遞歸至啟動類加載器 → 父加載器無法加載(ClassNotFoundException) → 子加載器嘗試自行加載。
核心優勢:
java.lang.String)。「類的完全限定名 + 定義它的加載器」共同確定類在 JVM 中的唯一性。不同加載器加載同名類互不相干(instanceof、Class.cast() 皆失效)。
深諳類加載機制,是排查 ClassNotFoundException/NoClassDefFoundError、實現熱部署、理解 SPI/模塊化系統的基石。