| 方法 | 用途 |
| 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> 批量轉為實體列表 |
關鍵程式碼節錄
動態建構子參數解析
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
最佳實踐提醒
- 效能考量:反射較慢,高頻路徑建議快取
Constructor/Method 物件,或改用 MethodHandle / VarHandle(JDK 9+)。
- 安全性:
setAccessible(true) 可繞過 private,需評估風險;模組化環境 (JPMS) 需 opens 宣告。
- 參數順序:建構子參數順序極度依賴編譯器產生順序,建議僅用於單一建構子或配合 @ConstructorProperties 註解。
- 異常處理:統一拋出
ReflectiveOperationException 父類別,簡化呼叫端 catches。
現代替代方案
- Jackson / Gson:JSON ↔ POJO 映射,效能優、註解豐富。
- MapStruct:編譯期生成映射代碼,零反射、類型安全。
- Spring BeanUtils / Apache BeanUtils:成熟的屬性複製工具。
反射是雙面刃,善用能構建極具彈性的框架,濫用則招致維護地獄。掌握核心 API、認清效能邊界、優先考慮現代替代庫,是架構師的必修課。
- 上一篇文章: Java 從亂碼文本反推原始編碼與內容
- 下一篇文章: Java 使用 HTTP 協議實現文件下載完整教學範例
Copyright ©
程式碼之家 All Rights Reserved