zoukankan      html  css  js  c++  java
  • 反射调用 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);

      使用请参考 这里

  • 相关阅读:
    常见的位运算技巧总结(膜wys)
    BZOJ1878:[SDOI2009]HH的项链
    BZOJ4300:绝世好题
    BZOJ1298:[SCOI2009]骰子的学问
    BZOJ2748:[HAOI2012]音量调节
    BZOJ1951:[SDOI2010]古代猪文
    BZOJ1002:[FJOI2007]轮状病毒
    BZOJ1081:[SCOI2005]超级格雷码
    BZOJ2595:[WC2008]游览计划
    BZOJ1190:[HNOI2007]梦幻岛宝石
  • 原文地址:https://www.cnblogs.com/hujunzheng/p/6778223.html
Copyright © 2011-2022 走看看