1. 程式人生 > >利用反射給JavaBean中的屬性進行讀寫操作類PropertyDescriptor

利用反射給JavaBean中的屬性進行讀寫操作類PropertyDescriptor

  • 概述
    PropertyDescriptor描述Java Bean中通過一對儲存器方法(getter / setter)匯出的一個屬性。我們可以通過該PropertyDescriptor對bean中的該屬性進行讀取和寫入操作,也可以設定其getter / setter。

  • 關鍵介面及內部屬性

public PropertyDescriptor(String name, Class<?> beanClass) throws IntrospectionException
public PropertyDescriptor(String name, Class<?> beanClass, String getMethodName, String setMethodName) throws IntrospectionException
public PropertyDescriptor(String name, Method readMethod, Method writeMethod) throws IntrospectionException

public Class<?> getPropertyType()
public Method getReadMethod()
public Method getWriteMethod()

public void setReadMethod(Method readMethod) throws IntrospectionException
public void setWriteMethod(Method writeMethod)
public boolean equals(Object o)&nbsp;

相關的PropertyDescriptor內部屬性如下:
Class<?> propertyType; //該屬性的型別
Method getMethod; //getter
Method setMethod; //setter
還有繼承自其父類FeatureDescriptor的功能,用於指定該屬性的程式設計名稱

  • 簡單應用
    Person類如下:
package com.cwind.property;

public class Person {
        private String name ;
        private int age ;
       
        public Person(){ this.name = ""; this.age = 0; }
        public Person(String name, int age) { super(); this.name = name; this. age = age; }

        public String getName() { return name; }
        public void setName(String name) { this. name = name; }

        public int getAge() { return age; }
        public void setAge(int age) { this. age = age; }
       
        public String getNameInUpperCase(){
               return this .name .toUpperCase();
       }
        public void setNameToLowerCase(String name){
               this.name = name.toLowerCase();
       }
}

該類中除了name和age兩個屬性的標準getter和setter之外,還有增加了一個獲取大寫name的get方法和一個將name設定為小寫的set方法。
在測試類中,首先獲得這兩個方法物件。

Class personClass = Class.forName("com.cwind.property.Person");
Method read = personClass.getMethod("getNameInUpperCase", null);
Method write = personClass.getMethod("setNameToLowerCase", String.class );

//然後可以通過兩種方式構造PropertyDescriptor
PropertyDescriptor prop1 = new PropertyDescriptor( "name", Person.class );     //使用其標準getter和setter
PropertyDescriptor prop2 = new PropertyDescriptor( "name", read, write);     //使用read和write兩個方法物件所自定義的getter和setter

//下面構建一個Person物件
Person person = new Person("Kobe" , 36);
System. out.println(prop1.getReadMethod().invoke(person, null));     // --實際呼叫Person.getName(), result: Kobe
System. out.println(prop2.getReadMethod().invoke(person, null));     // --實際呼叫Person.getNameInUpperCase(), result: KOBE
                     
prop1.getWriteMethod().invoke(person, "James");     // --實際呼叫Person.setName(), person.name被設定為James
prop2.getWriteMethod().invoke(person, "James");     // --實際呼叫Person.setNameToLowerCase(), person.name被設定為james

  • 利用PropertyDescriptor類抽象公共方法
/**
     * @Methodname:converter 資料轉換工具將value轉為name
     * 
     * 將List<SysDictionaryDo> dicList物件裡的value屬性值
     * 賦值給 List<T> list物件裡的field屬性
     */
    public static <T> void converter(List<T> list, List<SysDictionaryDo> dicList, String field) throws Exception {
        if (CollectionUtils.isEmpty(list)) {
            return;
        }
        PropertyDescriptor pd = new PropertyDescriptor(field, list.get(0).getClass());
        Method readMethod = pd.getReadMethod();
        Method writeMethod = pd.getWriteMethod();
        for (int i = 0; i < list.size(); i++) {
            T obj = list.get(i);
            String key = (String) readMethod.invoke(obj);
            for (SysDictionaryDo dic : dicList) {
                if (dic.getValue().equals(key)) {
                    writeMethod.invoke(obj, dic.getName());
                }
            }
        }
    }