PropertyDescriptor动态setter和getter设置对象属性
生活随笔
收集整理的這篇文章主要介紹了
PropertyDescriptor动态setter和getter设置对象属性
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
PropertyDescriptor
我們在開發的過程中,有時會需要動態地設置屬性,也就是動態getter、 setter。
使用傳統的反射 Method、Field等類去處理,需要對方法名進行大量拼接,比較麻煩。
可以使用 PropertyDescriptor.
常用方法:
構造方法:
PropertyDescriptor(String propertyName, Class<?> beanClass): 第一個參數是屬性名稱,第二個參數是Class類。
其他方法:
Method getReadMethod(): 返回 Method
propertyDescriptor.getReadMethod().invoke(Object obj, Object... args):
相當于 get方法。第一個參數是對象,后面的參數是屬性名稱
propertyDescriptor.getWriteMethod().invoke(Object obj): 相當于 set方法。
示例如下:
對象類 Person :
public class Person {
private int age;
private String name;
private String address;
//getter、 setter方法
}
PropertyDescriptor使用如下:
public static void propertyDescriptorTest() {
try {
Person person = new Person();
//setter
PropertyDescriptor propertyDescriptor = new PropertyDescriptor("address", Person.class);
propertyDescriptor.getWriteMethod().invoke(person, "深圳市");
//getter
String address = (String)propertyDescriptor.getReadMethod().invoke(person);
System.out.println(address);
} catch (Exception e) {
log.error("property Exception.",e);
}
}
BeanWrapper 和 BeanWrapperImpl
BeanWrapper和BeanWrapperImpl是 Spring的接口和類,可以通過BeanWrapper和BeanWrapperImpl獲取 PropertyDescriptor。
構造方法:
BeanWrapperImpl(Object object): 參數為對象
其他方法:
PropertyDescriptor[] getPropertyDescriptors(): 用于獲取對象的所有 PropertyDescriptor
PropertyDescriptor getPropertyDescriptor(String var1) throws InvalidPropertyException: 獲取指定屬性名稱的PropertyDescriptor
BeanWrapperImpl示例如下:
通過 BeanWrapper獲取 PropertyDescriptor:
public static void getPropertyByBeanWrapper() {
try {
Person person = new Person();
//初始化
BeanWrapper beanWrapper = new BeanWrapperImpl(person);
//setter
PropertyDescriptor propertyDescriptor = beanWrapper.getPropertyDescriptor("address");
propertyDescriptor.getWriteMethod().invoke(person, "深圳市");
//getter
String address = (String)propertyDescriptor.getReadMethod().invoke(person);
System.out.println(address);
} catch (Exception e) {
log.error("getPropertyNameDescriptor exception.", e);
}
}
通過 BeanWrapper 設置所有的屬性:
public static void setAllProperty(Person person) {
BeanWrapper beanWrapper = new BeanWrapperImpl(person);
//獲取所有的 propertyDescriptor
PropertyDescriptor[] propertyDescriptors = beanWrapper.getPropertyDescriptors();
for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
String name = propertyDescriptor.getName();
Class<?> propertyType = propertyDescriptor.getPropertyType();
boolean isNull = beanWrapper.getPropertyValue(name) == null;
//所有String類型的屬性,如果為null,改為""
if (String.class == propertyType && isNull) {
beanWrapper.setPropertyValue(name, "");
}
//所有Integer類型的屬性,如果為null,改為0
if (Integer.class == propertyType && isNull) {
beanWrapper.setPropertyValue(name, 0);
}
}
}
總結
以上是生活随笔為你收集整理的PropertyDescriptor动态setter和getter设置对象属性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: javascript 秒表计时器
- 下一篇: 计算机系统的分类