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

Java 反射核心:Class 類完整 API 速查與實戰示例

     編輯:Java 綜合教學

Class 對象的三種獲取方式

// 1. 對象實例
Class<?> c1 = obj.getClass();
// 2. 類字面量(編譯期已知)
Class<String> c2 = String.class;
// 3. 字符串全限定名(運行期動態)
Class<?> c3 = Class.forName("java.lang.String");

Class 類型判斷矩陣

方法判斷對象示例
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();

實戰建議

  1. 優先用 getDeclaredMethod 獲取私有方法,配合 setAccessible(true) 突破封裝。
  2. 高性能場景緩存 Method/Field 對象,避免重複反射解析。
  3. 框架開發中善用 getGenericSuperclass() 解析泛型參數(如 MyBatis Mapper、Spring Repository)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved