日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

PropertyDescriptor动态setter和getter设置对象属性

發布時間:2023/12/13 综合教程 30 生活家
生活随笔 收集整理的這篇文章主要介紹了 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设置对象属性的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。