// 1. 對象實例
Class<?> c1 = obj.getClass();
// 2. 類字面量(編譯期已知)
Class<String> c2 = String.class;
// 3. 字符串全限定名(運行期動態)
Class<?> c3 = Class.forName("java.lang.String");
| 方法 | 判斷對象 | 示例 |
|---|---|---|
| isPrimitive() | 基本類型 | int.class → true |
| isArray() | 數組類型 | int[].class → true |
| isInterface() | 接口類型 | List.class → true |
| isAnnotation() | 注解類型 | Override.class → true |
| isEnum() | 枚舉類型 | Thread.State.class → true |
注意:注解同時滿足 isInterface() 與 isAnnotation(),但不能被 implements。
Class<?> inner = Class.forName("com.example.Outer$Inner");
inner.getName(); // com.example.Outer$Inner (JVM 內部名)
inner.getCanonicalName(); // com.example.Outer.Inner (源碼規範名)
inner.getSimpleName(); // Inner (簡單名)
class Child extends Parent<String> implements Comparable<Integer> {}
// 獲取帶泛型參數的父類
Type genSuper = Child.class.getGenericSuperclass();
// ParameterizedType: Parent
Type[] genInterfaces = Child.class.getGenericInterfaces();
// ParameterizedType: Comparable
// 獲取原始 Class(擦除泛型)
Class<?> rawSuper = Child.class.getSuperclass(); // Parent
Class<?>[] rawInterfaces = Child.class.getInterfaces(); // [Comparable]
| 方法 | 適用場景 | 返回值 |
|---|---|---|
| getDeclaringClass() | 成員內部類/靜態內部類 | 外部類 Class |
| getEnclosingClass() | 所有內部類 | 最近外部類 Class |
| getEnclosingMethod() | 局部/匿名內部類 | 所在方法 Method |
| getEnclosingConstructor() | 局部/匿名內部類 | 所在構造器 Constructor |
判斷內部類類型:isMemberClass()、isLocalClass()、isAnonymousClass()。
getConstructors() / getMethods() / getFields():只獲取 public 成員(含繼承)。getDeclaredConstructors() / getDeclaredMethods() / getDeclaredFields():獲取本類聲明的所有成員(含 private,不含繼承)。// 無參構造實例化
Object obj = clazz.newInstance(); // 已棄用 Java 9+
// 推薦
Object obj = clazz.getDeclaredConstructor().newInstance();
// 類型檢查與轉換
if (clazz.isInstance(obj)) { // 相當於 obj instanceof Clazz
T t = clazz.cast(obj); // 安全轉型
}
// 相對類路徑加載資源
URL url = clazz.getResource("config.properties"); // 同包下
InputStream in = clazz.getResourceAsStream("config.properties");
// 獲取類加載器
ClassLoader cl = clazz.getClassLoader(); // null 代表 Bootstrap
// 系統類加載器
ClassLoader sys = ClassLoader.getSystemClassLoader();
// 程序化啟用斷言
clazz.getClassLoader().setClassAssertionStatus("com.example.AssertDemo", true);
// 運行時檢查
boolean enabled = clazz.desiredAssertionStatus();
getDeclaredMethod 獲取私有方法,配合 setAccessible(true) 突破封裝。Method/Field 對象,避免重複反射解析。getGenericSuperclass() 解析泛型參數(如 MyBatis Mapper、Spring Repository)。