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

Java 反射機制識別基本型別屬性並實現通用屬性填充

     編輯:Java 相關知識

基本型別與包裝類的 Type 對應

Java 八大基本型別各有對應的 Class 常數:

  • Integer.TYPE 代表 int
  • Long.TYPE 代表 long
  • Boolean.TYPE 代表 boolean
  • ... 以此類推

此設計使得「未知 JavaBean 的通用屬性填充」成為可能:透過 PropertyDescriptor 取得寫入方法的參數型別,再依 Class 物件判斷轉換策略。

通用屬性填充範例

Object bean = ...; // 目標 Bean
BeanInfo bi = Introspector.getBeanInfo(bean.getClass());
PropertyDescriptor[] pds = bi.getPropertyDescriptors();

for (PropertyDescriptor pd : pds) {
    String name = pd.getName();
    String value = request.getParameter(name); // 來自 HTTP 請求
    if (value != null) {
        Method setter = pd.getWriteMethod();
        Class paramType = setter.getParameterTypes()[0];
        Object converted = convert(value, paramType);
        setter.invoke(bean, converted);
    }
}

型別轉換核心邏輯

public Object convert(Object value, Class type) {
    String typeName = type.getName();
    if ("java.lang.String".equals(typeName)) {
        return value.toString();
    } else if ("java.lang.Long".equals(typeName) || type == Long.TYPE) {
        return Long.valueOf(value.toString());
    } else if ("java.lang.Integer".equals(typeName) || type == Integer.TYPE) {
        return Integer.valueOf(value.toString());
    } else if ("java.lang.Boolean".equals(typeName) || type == Boolean.TYPE) {
        return Boolean.valueOf(value.toString());
    } else if ("java.lang.Double".equals(typeName) || type == Double.TYPE) {
        return Double.valueOf(value.toString());
    } // ... 其他型別
    throw new IllegalArgumentException("Unsupported type: " + typeName);
}

實務應用價值

  • Web 框架自動表單綁定(Struts、Spring MVC 底層原理)。
  • 通用資料匯入/匯出工具。
  • 動態代理與 AOP 參數攔截轉換。

現代化替代方案

Java 8+ 可結合 MethodHandles、VarHandle 提升效能;Jackson、Gson 等序列化庫已內建高效能反射快取與型別適配,生產環境優先採用成熟庫。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved