在 Java 開發中,動態加載類是實現插件架構、熱部署及框架擴展的核心技術。本文系統梳理 Java 加載外部 Class 的主要方法,涵蓋 Class.forName、ClassLoader.loadClass 以及直接實例化三大核心路徑,並對動態加載 JAR 與 Class 文件的完整流程進行說明。
若需加載類路徑之外的 JAR 包或 .class 文件,通常需結合 URLClassLoader 或自定義類加載器。基本步驟如下:
URL 陣列。URLClassLoader(或繼承 ClassLoader 重寫 findClass)。loadClass 或 Class.forName 完成類加載與初始化。完成上述步驟後,即可像使用普通類一樣透過反射創建實例、調用方法。
Class.forName 是最常見的動態加載入口,它會觸發類的初始化(執行 static 區塊)。典型用法:
Class> cls = Class.forName("com.example.TargetClass");
Object instance = cls.getDeclaredConstructor().newInstance();
注意:若僅需加載不初始化,可使用 Class.forName(name, false, loader) 重載版本。
直接操作 ClassLoader 可獲得更精細的控制(如指定父加載器、隔離命名空間)。標準流程:
// 1. 獲取類加載器(如線程上下文加載器或自定義加載器)
ClassLoader cl = Thread.currentThread().getContextClassLoader();
// 2. 加載類(不初始化)
Class> cls = cl.loadClass("com.example.TargetClass");
// 3. 手動初始化或實例化
Object obj = cls.getDeclaredConstructor().newInstance();
此方式適合模塊化系統中實現類隔離、版本共存等場景。
當類已在編譯期可見且位於應用類路徑時,直接 new TargetClass() 即可。此過程隱含了類加載、鏈接、初始化三個階段,屬於靜態加載,不屬於動態加載範疇。
實際項目中,建議優先使用標準 API,僅在需要突破雙親委派、實現熱部署或加載非標準來源類時引入自定義加載器。