首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 類加載器:Class.forName 與 loadClass 差異,必須使用完整類名含套件

     編輯:程式設計綜合問答

錯誤現象

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 區塊)**否** (僅載入字節碼,不執行 )
預設類加載器呼叫者類的加載器指定的加載器實例 (此處為系統加載器)
拋出異常ClassNotFoundExceptionClassNotFoundException

驗證代碼

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!"); }
}

總結

  • **永遠使用完整類名** (含套件)。
  • 需觸發靜態初始化用 `Class.forName()`;僅需載入字節碼 (如檢查類是否存在) 用 `loadClass()`。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved