利用反射給JavaBean中的屬性進行讀寫操作類PropertyDescriptor
阿新 • • 發佈:2018-12-29
-
概述
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)
相關的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());
}
}
}
}