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

Java 反射機制深度解析:從基礎 API 到實戰應用

     編輯:Java 程式設計入門

什麼是反射?

反射 是 Java 語言的核心特性之一,允許執行中的程式檢視自身結構、動態獲取類別資訊(方法、欄位、建構子等)並進行操作。這在 C/C++ 等靜態語言中幾乎無法實現,是 Java 動態性的基石,廣泛應用於框架開發、序列化、依賴注入等場景。

核心三步驟

  1. 獲取 Class 物件:Class.forName("全限定類名")、類別名.class、實例.getClass()
  2. 提取結構資訊:getDeclaredMethods()、getDeclaredFields()、getDeclaredConstructors()
  3. 動態操作:Method.invoke()、Field.set()、Constructor.newInstance()

關鍵 API 實戰示範

1. 列出類別所有方法

Class<?> cls = Class.forName("java.util.Stack");
Method[] methods = cls.getDeclaredMethods();
for (Method m : methods) {
    System.out.println(m.toString()); // 含修飾詞、回傳型別、參數列表
}

2. 模擬 instanceof 檢查

Class<?> cls = Class.forName("A");
System.out.println(cls.isInstance(new Integer(37))); // false
System.out.println(cls.isInstance(new A()));         // true

3. 動態呼叫指定方法

Class<?> cls = Class.forName("MethodDemo");
Method add = cls.getMethod("add", int.class, int.class);
Object result = add.invoke(cls.getDeclaredConstructor().newInstance(), 37, 47);
System.out.println(result); // 84

4. 動態建立物件與操作欄位

// 建構子帶參實例化
Constructor<?> ctor = cls.getConstructor(int.class, double.class);
Object obj = ctor.newInstance(10, 3.14);

// 修改 private 欄位
Field field = cls.getDeclaredField("secret");
field.setAccessible(true);
field.set(obj, "new value");

5. 陣列動態操作

// 建立 String[10]
Object arr = Array.newInstance(String.class, 10);
Array.set(arr, 5, "test");
String val = (String) Array.get(arr, 5);

// 多維陣列 int[5][10][15]
int[] dims = {5, 10, 15};
Object matrix = Array.newInstance(int.class, dims);
Array.setInt(Array.get(Array.get(matrix, 3), 5), 10, 37);

反射的雙面性

優勢代價
極致動態性、框架級解耦效能開銷(JIT 難優化)、破壞封裝、編譯期失去型別檢查

生產建議:核心熱路徑避免反射;框架啟動期掃描、註解處理、配置綁定等場景大膽使用。JDK 9+ 推薦改用 MethodHandles / VarHandles 獲得更好效能與模組化支援。

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