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

Java 反射獲取/設置私有欄位值完整教學

     編輯:Java 相關知識

反射可破壞封裝,在運行期動態讀寫私有欄位、呼叫方法,是框架 (Spring/Hibernate/Jackson) 核心機制。本文通過 UserBean 實例演示完整流程。

目標 Bean

public class UserBean {
    private Integer id;
    private int age;
    private String name;
    private String address;
    // getter/setter 省略
}

反射核心代碼

UserBean bean = new UserBean();
bean.setId(100);
bean.setAddress("武漢");

Class clazz = bean.getClass();

// 1. 獲取所有宣告欄位 (含私有)
Field[] fields = clazz.getDeclaredFields();
for (Field f : fields) {
    f.setAccessible(true); // 關鍵:暴力反射
    Object val = f.get(bean);
    System.out.println("欄位: " + f.getName() + " = " + val);

    // 2. 根據型別動態設值
    Class type = f.getType();
    if (type == String.class) f.set(bean, "反射修改");
    else if (type == int.class || type == Integer.class) f.set(bean, 999);
}

// 3. 獲取 getter 方法並調用
for (Method m : clazz.getMethods()) {
    if (m.getName().startsWith("get")) {
        System.out.println(m.getName() + " = " + m.invoke(bean));
    }
}

關鍵點總結

  • getDeclaredFields() 取得**本類宣告**欄位 (含 private);getFields() 僅取 public (含繼承)。
  • f.setAccessible(true) 關閉存取檢查,**生產碼慎用**,框架內部常見。
  • 基本型別欄位 f.getType() 回傳 int.class 等;包裝型別回傳 Integer.class。
  • Method.invoke(obj, args) 需傳遞實例 (靜態方法傳 null)。
  • 異常處理:IllegalAccessException、InvocationTargetException (底層真實異常在 getCause())。

進階場景

  • 通用 toString()、equals()、序列化工具類實作。
  • 運行期注入配置值 (如 @Value("${key}") 解析)。
  • 熱加載/插件系統動態載入類別並實例化。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved