Class<T> 實例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。
getName():完整類名(陣列回傳 [Ljava.lang.String; 等內部格式)newInstance():呼叫無參建構子創建實例(已棄用,改用 getDeclaredConstructor().newInstance())getClassLoader():取得載入該類的 ClassLoadergetSuperclass():父類 Class(Object 回傳 null)isArray() / getComponentType():陣列型別判斷與元素型別getDeclaredFields/Methods/Constructors():含 private 的全部成員(不含繼承)getFields/Methods/Constructors():僅 public 成員(含繼承)Object obj = Class.forName(className).getDeclaredConstructor().newInstance();
== 而非 equalsif (obj.getClass() == String.class) { ... } // 唯一性保證,極快
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 物件保留泛型資訊
Class 物件<clinit>()(static 欄位賦值 + static 塊)觸發初始化的 5 種主動使用:new、讀/寫 static 欄位、呼叫 static 方法、反射、初始化子類。