Java 區別於 C/C++ 等靜態編譯語言的核心在於其「動態性」:類在運行時才被載入、鏈接、初始化,且可由多個類載入器隔離、動態替換。本系列將從二進制類格式、反射、字節碼操作、載入時織入等層層遞進,揭示 Java 動態編程的全貌。
編譯器產出的 .class 文件遵循 JVM 規範,核心組成:
0xCAFEBABE 識別類文件。字節碼是針對基於堆疊的虛擬機器指令集。早期 JVM 解釋執行,後引入 JIT 即時編譯為機器碼,現代 JVM 更採用自適應優化(熱點檢測、內聯、逃逸分析等)。
rt.jar),無父載入器,跳過大部分驗證。jre/lib/ext 目錄。classpath 指定的類。ClassLoader,可實現熱部署、模塊隔離(如 Tomcat、OSGi)。委派規則:子載入器收到請求先委派給父載入器,父載入器找不到時子載入器才嘗試載入。確保核心類不被篡改,且同一類在層級中只被載入一次。

父載入器可見的類對子載入器可見,反之不可。解決衝突靠共享接口(如 javax.servlet.Servlet)。

兩個載入器各自載入接口 I 與實現 A,即使字節碼完全相同,A@Loader1 不是 I@Loader2 的實例。解決:將接口放入共同父載入器(如 System)。
即使最簡單的 HelloWorld,JVM 啟動也需載入數百核心類。此開銷使 Java 更適合長期運行的服務端應用,而非頻繁啟動的小工具。但服務端恰恰最受益於運行時組裝、熱替換等動態特性。
理解類載入奠定了動態操作的基礎。第二部分將介紹反射,讓運行中的代碼能檢查、調用任意類結構。