Java 常被稱為「半動態」語言,本文通過對比 JavaScript 與 Java 的編譯運行機制,結合實戰代碼演示 Class.forName() 實現的動態類加載,深入剖析 Java 靜態編譯與動態特性的邊界。
| 維度 | Java | JavaScript |
|---|---|---|
| 運行環境 | JVM 執行字節碼 | 瀏覽器直接解析執行 |
| 編譯階段 | 預編譯為 .class | 無編譯,即時解釋 |
| 類型系統 | 強類型、靜態檢查 | 弱類型、動態檢查 |
| 動態特性 | 支持運行時加載類 | 天然動態語言 |
常規寫法中,Frame 直接 new Color(),編譯期確定依賴關係。若 Color.class 丟失,運行時拋出 NoClassDefFoundError,這是典型的靜態綁定特徵。
public class Frame {
public static void main(String[] args) {
Color c = new Color(); // 編譯期綁定
c.changeColor();
}
}
通過接口 Color + 實現類 ColorImp + Class.forName(),實現運行時動態決策:
Frame.class、Color.class(接口)Class.forName() 加載指定類,newInstance() 實例化public static void main(String[] args) throws Exception {
Scanner sc = new Scanner(System.in);
String className = sc.next(); // 輸入 "ColorImp"
Class> clazz = Class.forName(className);
Color color = (Color) clazz.newInstance();
color.changeColor(); // 動態分派
}
驗證過程:先運行 Frame 拋出 ClassNotFoundException,另開終端編譯 ColorImp.java,回車繼續運行即成功——無需重啟主程序即可熱加載新實現。
JDBC 正是利用此機制:DriverManager 僅依賴 java.sql.Driver 接口,具體驅動由廠商實現(如 com.mysql.jdbc.Driver)。應用層通過 Class.forName("com.mysql.jdbc.Driver") 解耦具體實現,體現「面向接口編程」的核心價值。
Class.forName、類加載器)可實現動態加載