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

Java 反射機制實戰:動態實例化、屬性注入與集合映射

     編輯:Java 相關知識

應用場景

通用 DAO、配置映射、插件系統、序列化框架等需要運行期根據類名/字串動態操作物件的場景。本文封裝一個 GetNewInstances<T> 工具類,涵蓋建構子參數解析、Setter 命名轉換、List<Map> 批量實例化等高頻需求。

核心功能清單

關鍵程式碼節錄

動態建構子參數解析

public Object getClassNewInstance(Class clazz) throws ... {
    Constructor[] ctors = clazz.getDeclaredConstructors();
    Class[] paramTypes = ctors[1].getParameterTypes(); // 假設用第 2 個建構子

    for (Class pt : paramTypes) {
        String typeName = pt.getSimpleName(); // String, int, Integer, Double...
        switch (typeName) {
            case "String":  getClassArrays(String.class);  break;
            case "int":     getClassArrays(int.class);     break;
            case "Integer": getClassArrays(Integer.class); break;
            // ... 其他基本型別與包裝類
        }
    }
    // ob 陣列需外部預先按順序填入實際值
    return clazz.getConstructor(cl).newInstance(ob);
}

List<Map> → 實體列表批量映射

public List getListByMap(List> listMap, Class clazz, String tableName) {
    List columns = GetMetaDataCloumName.getCloumNameList(tableName); // 從 DB 取欄位順序
    List result = new ArrayList<>();

    for (Map row : listMap) {
        setNullToArrays(); // 重置參數陣列
        for (String col : columns) getObjectArrays(row.get(col)); // 按欄位順序填值
        Object entity = clazz.getConstructor(cl).newInstance(ob);
        result.add(entity);
    }
    return result;
}


最佳實踐提醒

  1. 效能考量:反射較慢,高頻路徑建議快取 Constructor/Method 物件,或改用 MethodHandle / VarHandle(JDK 9+)。
  2. 安全性:setAccessible(true) 可繞過 private,需評估風險;模組化環境 (JPMS) 需 opens 宣告。
  3. 參數順序:建構子參數順序極度依賴編譯器產生順序,建議僅用於單一建構子或配合 @ConstructorProperties 註解。
  4. 異常處理:統一拋出 ReflectiveOperationException 父類別,簡化呼叫端 catches。

現代替代方案

  • Jackson / Gson:JSON ↔ POJO 映射,效能優、註解豐富。
  • MapStruct:編譯期生成映射代碼,零反射、類型安全。
  • Spring BeanUtils / Apache BeanUtils:成熟的屬性複製工具。

反射是雙面刃,善用能構建極具彈性的框架,濫用則招致維護地獄。掌握核心 API、認清效能邊界、優先考慮現代替代庫,是架構師的必修課。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
方法用途
getClassNewInstance(Class)分析建構子參數類型,自動準備參數陣列並實例化
getSetterStr(String field)字段名 → Setter 方法名(name → setName)
setSetStr(String setter)Setter 方法名 → 字段名(setName → name)
getFielsdArray(Class)取得所有宣告字段(含 private)
getMethodsArray(Class)取得所有公開方法
getListByMap(List<Map>, Class, tableName)根據資料庫欄位順序,將 List<Map> 批量轉為實體列表