Class.forName("S"); // ClassNotFoundException
ClassLoader.getSystemClassLoader().loadClass("S"); // 同錯誤
類 `S` 定義於 `org.zeng.reflect` 套件下,但傳入簡單名 `"S"`。
**類加載器要求「完全限定名」 (Fully Qualified Name)**,即 `套件名.類名`。簡單名無法唯一識別類。
Class.forName("org.zeng.reflect.S"); // 正確
ClassLoader.getSystemClassLoader().loadClass("org.zeng.reflect.S"); // 正確
| 特性 | Class.forName() | ClassLoader.loadClass() |
|---|---|---|
| 初始化類 | **是** (執行 static 區塊) | **否** (僅載入字節碼,不執行 |
| 預設類加載器 | 呼叫者類的加載器 | 指定的加載器實例 (此處為系統加載器) |
| 拋出異常 | ClassNotFoundException | ClassNotFoundException |
public class TestReflection {
public static void main(String[] args) {
try {
// 會印出 "S is loaded!" (static 區塊執行)
Class.forName("org.zeng.reflect.S");
// 不會印出 "S is loaded!" (僅載入)
ClassLoader.getSystemClassLoader().loadClass("org.zeng.reflect.S");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
class S {
static { System.out.println("S is loaded!"); }
public S() { System.out.println("S is instance!"); }
}