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

java.lang.Class 核心機制深度解析:類物件、反射入口與 JVM 類載入

     編輯:Java 綜合教學

Class 物件的本質

  • JVM 為每個型別(類、介面、基本型別、void、陣列)創建唯一的 Class<T> 實例
  • 載入時機:首次主動使用(new、static 欄位/方法、反射、Class.forName、子類初始化)
  • 載入器雙親委派模型保證同一類在同一載入器下只有一份 Class 物件

三種取得 Class 物件的方式

方式程式碼適用場景
Object.getClass()Class<?> c = obj.getClass();已有實例物件
類字面常數Class<String> c = String.class;編譯期已知型別,效能最佳
Class.forName()Class<?> c = Class.forName("java.lang.String");執行期動態載入(如 JDBC 驅動)

注意:基本型別也有對應 Class(int.class、double[].class),陣列同維度同元素型別共用一個 Class。

常用 API 速查

  • getName():完整類名(陣列回傳 [Ljava.lang.String; 等內部格式)
  • newInstance():呼叫無參建構子創建實例(已棄用,改用 getDeclaredConstructor().newInstance())
  • getClassLoader():取得載入該類的 ClassLoader
  • getSuperclass():父類 Class(Object 回傳 null)
  • isArray() / getComponentType():陣列型別判斷與元素型別
  • getDeclaredFields/Methods/Constructors():含 private 的全部成員(不含繼承)
  • getFields/Methods/Constructors():僅 public 成員(含繼承)

進階技巧

1. 字串動態實例化

Object obj = Class.forName(className).getDeclaredConstructor().newInstance();

2. 型別比較用 == 而非 equals

if (obj.getClass() == String.class) { ... }  // 唯一性保證,極快

3. 泛型型別擦除後的運期型別捕獲

public class Box<T> {
    private final Class<T> type;
    public Box(Class<T> type) { this.type = type; }
    public T create() { return type.getDeclaredConstructor().newInstance(); }
}
new Box<>(String.class).create();  // 傳遞 Class 物件保留泛型資訊

JVM 類載入五階段

  1. 載入:二進制位元組流 → 方法區資料結構 → 建立 Class 物件
  2. 驗證:檔案格式、元資料、位元組碼、符號引用驗證
  3. 準備:靜態欄位分配記憶體並設預設值(0/null/false)
  4. 解析:符號引用 → 直接引用(常數池)
  5. 初始化:執行 <clinit>()(static 欄位賦值 + static 塊)

觸發初始化的 5 種主動使用:new、讀/寫 static 欄位、呼叫 static 方法、反射、初始化子類。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved