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

Java Reflection API 核心能力與實戰模式

     編輯:Java 相關知識

反射 API 讓程序在運行時檢查類結構、創建實例、訪問字段、調用方法,是 IDE、調試器、框架(Spring、Hibernate)的基石。本文通過 Employee 類示例,演示類信息提取、方法/字段/構造器枚舉、運行時動態調用全流程。

核心能力清單

  • 判斷對象實際類型(obj.getClass())。
  • 獲取類修飾符、字段、方法、構造器、父類、接口等元數據。
  • 運行時實例化類(類名來自配置/參數)。
  • 動態讀寫字段(字段名運行時確定)。
  • 動態調用方法(方法名運行時確定)。

實戰示例:分析 Employee 類

public class Employee {
    public String empNum, empName;
    public Employee() { this("1", "King"); }
    public Employee(String n, String name) { empNum=n; empName=name; }
    public String toString() { return "EmpNum:"+empNum+", EmpName:"+empName; }
}

1. 類基本信息

Employee e = new Employee();
Class<?> clazz = e.getClass();
System.out.println("類名: " + clazz.getName());
System.out.println("父類: " + clazz.getSuperclass().getName());
int mods = clazz.getModifiers();
System.out.println("public: " + Modifier.isPublic(mods));
System.out.println("final: " + Modifier.isFinal(mods));
System.out.println("abstract: " + Modifier.isAbstract(mods));

輸出:類名: Employee, 父類: java.lang.Object, public: true, final: false, abstract: false

2. 枚舉所有聲明方法

Method[] methods = clazz.getDeclaredMethods();
for (Method m : methods) System.out.println(m);

輸出包含 toString、getEmpNum、setEmpNum 等。

3. 枚舉所有公共字段

Field[] fields = clazz.getFields(); // 僅 public
for (Field f : fields) System.out.println(f);

輸出:public java.lang.String Employee.empNum、public java.lang.String Employee.empName

4. 構造器參數分析

Constructor[] ctors = clazz.getConstructors();
for (Constructor c : ctors) {
    System.out.println(c);
    Class[] params = c.getParameterTypes();
    for (int i=0;i

輸出兩個構造器:(String, String) 與 ()。

動態加載與調用模式

Class dynamicClass = Class.forName("com.example.ServiceImpl");
Object instance = dynamicClass.newInstance(); // 或獲取構造器 newInstance(args)
Method method = dynamicClass.getMethod("setProperties", Properties.class);
method.invoke(instance, new Properties());

此模式廣泛用於插件系統、腳本引擎、配置驅動框架。

性能與安全提示

  • 性能:反射調用比直接調用慢 10-100 倍,熱路徑請緩存 Method/Field/Constructor 對象,或使用 MethodHandle/Invokedynamic (Java 7+)。
  • 安全:setAccessible(true) 可破壞封裝,需配合 SecurityManager 控制。
  • 模塊化:Java 9+ 模塊系統要求 opens 導出包才能深度反射內部類。

典型應用場景

  1. 依賴注入容器(Spring 自動裝配)。
  2. ORM 框架(Hibernate 映射實體字段)。
  3. 序列化庫(Jackson/Gson 遍歷字段)。
  4. 測試框架(JUnit 發現 @Test 方法)。
  5. 動態代理(JDK Proxy / CGLIB)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved