使用内省完成JavaBean到集合的封装

使用内省完成JavaBean到集合的封装

使用内省得到JavaBean的属性和操作这些属性的方法,将数据封装到集合中或者把集合中的数据封装到JavaBean。

内省对象介绍

-BeanInfo–提供有关其 bean 的方法、属性、事件等显式信息描述的接口类。
方法:
getMethodDescriptors()–获得JavaBean所有方法的描述对象数组
getPropertyDescriptors() –获得JavaBean的所有属性的描述对象数组
-Introspector–提供获取bean信息方法的工具类。
方法:
getBeanInfo(Class beanClass)–在 Java Bean 上进行内省,了解其所有属性、公开的方法和事件.
-MethodDescriptor–描述JavaBean的方法的对象
-PropertyDescriptor–描述JavaBean的属性的对象
* 方法*
getReadMethod()–得到该属性的获取值的方法,即getXX()方法。
getWriteMethod()–得到属性的设值方法,即setXX()方法。

实例代码

  • JavaBean数据封装到Map集合中
/**
     * JavaBean转为Map集合
     * 
     * @param q
     *            JavaBean对象
     * @return Map集合
     */
    public static <Q> Map<String, Object> beanToMap(Q q) {
        BeanInfo beanInfo = null;
        Map<String, Object> map = new HashMap<String, Object>();
        try {
            // 拿到泛型为Q的bean的信息
            beanInfo = Introspector.getBeanInfo(q.getClass());

            // 拿到该bean的方法和属性的描述类数组
            MethodDescriptor[] methodDescriptors = beanInfo.getMethodDescriptors();
            PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();

            for (PropertyDescriptor pDescriptor : propertyDescriptors) {
                System.out.println("pDescriptor.getName()=" + pDescriptor.getName() + "; getShortDescription=" + pDescriptor.getShortDescription() + "; id="
                        + pDescriptor.getValue("id"));
            }
            for (MethodDescriptor mDescriptor : methodDescriptors) {
                System.out.println("mDescriptor.getName()=" + mDescriptor.getName() + "; getShortDescription=" + mDescriptor.getShortDescription() + "; id="
                        + mDescriptor.getValue("id"));
            }
            // 遍历将bean的属性值放入Map中
            for (PropertyDescriptor pDescriptor : propertyDescriptors) {
                String displayName = pDescriptor.getDisplayName();
                // 使用内省拿到该属性的获取值的方法,并调用该方法得到属性值
                Object invokeValue = pDescriptor.getReadMethod().invoke(q, new Object[] {});

                System.out.println("displayName=" + displayName + "; invokeValue=" + invokeValue);
                // 存入map集合
                if (!"class".equals(displayName)) {
                    map.put(displayName, invokeValue);
                }
            }
        } catch (IntrospectionException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println(map);
        return map;
    }

Map集合数据封装到JavaBean中

public static <Q> Q mapToBean(Map<String, Object> map, Q q) {
        BeanInfo beanInfo = null;
        try {
            // 拿到bean的信息
            beanInfo = Introspector.getBeanInfo(q.getClass());
            PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();

            // 遍历属性并赋值
            for (PropertyDescriptor pd : propertyDescriptors) {
                if (!"class".equals(pd.getDisplayName())) {
                    String proName = pd.getDisplayName();
                    // 使用内省拿到该属性的设值方法,并调用该方法执行赋值
                    pd.getWriteMethod().invoke(q, map.get(proName));

                }
            }

        } catch (IntrospectionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println(q);
        return q;

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值