反射調用 java bean的set和get方法


一、使用java.beans.PropertyDescriptor

import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class PropertyUtil {
    
    private static final String SET_PREFIX = "set";
    private static final String IS_PREFIX = "is";
    private static final String GET_PREFIX = "get";
    
    public static PropertyDescriptor getPropertyDescriptor(Class<?> clazz, String propertyName) {//根據需求,定制 自己的get和set方法
        Method setMethod = null;
        Method getMethod = null;
        PropertyDescriptor pd = null;
        try {
            Field field = clazz.getDeclaredField(propertyName);// 根據字段名來獲取字段
            if (field != null) {
                // 構建方法的后綴
                String methodEnd = propertyName.substring(0, 1).toUpperCase() + propertyName.substring(1);
                setMethod = clazz.getDeclaredMethod(SET_PREFIX + methodEnd, new Class[] { field.getType() });
                // 構建get 方法
                getMethod = clazz.getDeclaredMethod(GET_PREFIX + methodEnd, new Class[] {});
                // 構建一個屬性描述器 把對應屬性 propertyName 的 get 和 set 方法保存到屬性描述器中
                pd = new PropertyDescriptor(propertyName, getMethod, setMethod);
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        return pd;
    }
    
    public static PropertyDescriptor getPropertyDescriptor2(Class<?> clazz, String propertyName) {//使用 PropertyDescriptor 提供的 get和set方法
        try {
            return new PropertyDescriptor(propertyName, clazz);
        } catch (IntrospectionException e) {
            e.printStackTrace();
        }
        return null;
    }

    public static void setProperty(Object obj, String propertyName, Object value) {
        Class<?> clazz = obj.getClass();// 獲取對象的類型
        PropertyDescriptor pd = getPropertyDescriptor(clazz, propertyName);// 獲取
                                                                            // clazz
                                                                            // 類型中的
                                                                            // propertyName
                                                                            // 的屬性描述器
        Method setMethod = pd.getWriteMethod();// 從屬性描述器中獲取 set 方法
        try {
            setMethod.invoke(obj, new Object[] { value });// 調用 set
                                                            // 方法將傳入的value值保存屬性中去
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static Object getProperty(Object obj, String propertyName) {
        Class<?> clazz = obj.getClass();// 獲取對象的類型
        PropertyDescriptor pd = getPropertyDescriptor(clazz, propertyName);// 獲取
                                                                            // clazz
                                                                            // 類型中的
                                                                            // propertyName
                                                                            // 的屬性描述器
        Method getMethod = pd.getReadMethod();// 從屬性描述器中獲取 get 方法
        Object value = null;
        try {
            value = getMethod.invoke(clazz, new Object[] {});// 調用方法獲取方法的返回值
        } catch (Exception e) {
            e.printStackTrace();
        }
        return value;// 返回值
    }
    
    
}

二、使用收藏的一個工具類 BeanHelper

  查看代碼

三、獲取一個類每個屬性的 PropertyDescriptor

 org.springframework.beans.BeanUtils

  PropertyDescriptor[] pds = BeanUtils.getPropertyDescriptors(mappedClass);

  使用請參考 這里

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM