學習 Java 兩年,記錄避坑指南供同好參考。本篇覆蓋三大基石:動態加載驗證、類文件尋找原理、JDK 與 JRE 關係。
概念易記,細節難悟。命令行執行:
java -verbose:class YourClass
控制台將打印所有加載類的順序。觀察可發現:聲明類變量不實例化,類不加載;只有真正用到對象(new、靜態方法/字段)時才觸發加載。這就是「動態加載」的鐵證。
初學堅持用命令行 javac/java -classpath,而非依賴 IDE。classpath 告訴編譯器/運行時去哪找 .class。JVM 依賴 ClassLoader,分三級(由高到低):
jre/lib/rt.jar 等核心庫,優先級最高。jre/lib/ext 目錄擴展庫。classpath 指定路徑(默認當前目錄)。尋找遵循「向上委派」:當前級找不到才向父級請求,不向下搜索。驗證方法:
new A().getClass().getClassLoader().toString()
打印 null 表示由 Bootstrap 加載。此機制由華人工程師宮力設計(JDK 1.4~1.6 細節有變,以官方文檔為準)。理解此點,排查 ClassNotFoundException/NoClassDefFoundError 將得心應手。
建議同時安裝 JDK 內置 JRE 與獨立 JRE,對比目錄結構:
jre/bin/client/jvm.dll) + 類庫 (jre/lib/rt.jar)。僅供運行。javac、jar 等) + 另一套完整 JRE(含 client 與 server 兩種 JVM 模式)。關鍵發現:環境變量 PATH 配 jdk/bin,但執行 java 命令實際調用的是 jre/bin/java.exe!實驗:剪切 jdk/bin/java.exe 後運行程序無影響。原因:安裝獨立 JRE 時,安裝程序自動將 java.exe 複製到 %SystemRoot%\system32(系統目錄在 PATH 最前),系統優先調用它。這也是為了讓無需開發的用戶免配置即能運行 Java 程序。
除非調試 JVM 參數差異,建議直接使用系統 JRE 運行,視為「客戶端環境驗證」。
