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

Java 反射工具類 ReflectUtils:構造實例、屬性讀寫、方法調用、Bean 比較全能封裝

     編輯:Java 綜合教學

Java 反射工具類 ReflectUtils:構造實例、屬性讀寫、方法調用、Bean 比較全能封裝

反射雖強大但 API 繁瑣,ReflectUtils 封裝了構造器實例化、屬性獲取/設置(支持巢狀屬性)、方法調用、暴力反射讀寫私有字段、兩個 Bean 差異比較等高頻操作,可直接納入項目公共庫。

核心功能清單

方法用途關鍵點
constructorNewInstance指定構造器參數類型/值創建實例setAccessible(true) 破壞私有構造器
getProperty / setProperties標準 JavaBean 屬性讀寫基於 PropertyDescriptor,支持 getter/setter
getBeanInfoProperty / setBeanInfoPropertyCommons BeanUtils 風格,字符串值,支持巢狀路徑user.address.city 形式
getPropertyUtilByName / setPropertyUtilByNameCommons PropertyUtils,保持原始類型區別於 BeanUtils 的字符串轉換
methodInvoke指定類/方法/參數類型/值調用方法支持私有方法
compareBeanValue比較兩個 Bean 差異,返回變更描述字符串配合字段註釋 Map,適合審計日誌
getFieldValue / setFieldValue暴力反射讀寫任意字段(含私有、繼承鏈)Apache Commons Lang FieldUtils

典型使用場景

  • 通用實體複製/轉換(DTO↔DO、VO↔Entity)。
  • 配置中心動態屬性注入。
  • 審計日誌:記錄實體修改前後差異。
  • 測試框架:調用私有方法、驗證內部狀態。
  • 插件化/熱加載:動態實例化類、調用方法。

關鍵實現細節

1. 暴力反射遍歷繼承鏈查找字段

public static Field getTargetField(Class targetClass, String fieldName) {
    if (targetClass == null || Object.class.equals(targetClass)) return null;
    Field field = FieldUtils.getDeclaredField(targetClass, fieldName, true); // 含私有
    if (field == null) {
        return getTargetField(targetClass.getSuperclass(), fieldName); // 遞歸向上
    }
    return field;
}

2. Bean 差異比較(審計日誌核心)

public static  String compareBeanValue(Map fields, T oldBean, T newBean) {
    StringBuilder sb = new StringBuilder();
    for (Map.Entry e : fields.entrySet()) {
        String prop = e.getKey().toLowerCase();
        Object oldVal = getProperty(prop, oldBean);
        Object newVal = getProperty(prop, newBean);
        if (Objects.equals(oldVal, newVal)) continue;
        sb.append("字段注釋: ").append(e.getValue())
          .append("】原屬性值\"").append(emptyToSpace(oldVal))
          .append("\"現屬性值\"").append(emptyToSpace(newVal)).append("\";");
    }
    return sb.toString();
}

依賴建議

  • org.apache.commons:commons-lang3(FieldUtils、StringUtils)。
  • org.apache.commons:commons-beanutils(BeanUtils、PropertyUtils)。
生產環境建議:
1. 緩存 PropertyDescriptor/Method/Field 避免重複反射開銷。
2. 異常統一拋 RuntimeException 或自定義檢查異常,調用者決策處理。
3. 大量反射場景考慮字節碼生成庫(ByteBuddy、ASM)替代,性能提升 10-100 倍。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved