JAVA重写copyProperties,使其支持Map类型

 

最近,项目组要用到一个功能,就是用BeanUtils.copyProperties复制一个Map里的属性值到另外一个对象。

   BeanUtils和PropertyUtils类是许多开源框架中频繁使用的两个工具,它们都能实现将一个类中的属性拷贝到另一个类中,这个功能甚至是spring实现依赖注入的基础。研究一下apache的comon包中如何实现这个两个工具,可以发现它们都是使用java.lang.reflect和java.beans这两个包下的几个类来实现的。

    但是BeanUtils.copyProperties只支持两个对象之间的复制,其原理:是利用反射读取到第一个对象(源类)的所有属性,然后对这些属性集合进行for循环,再在for循环里面判断这些属性是否有set方法,有则再对第二个对象(目标类)进行循环取出属性一一对比,相等则调用目标类的set方法得到源类的get方法得到的值。

    改后主要就是两点:第一:源类(Map类型)的Key作为属性和目标类的属性对比,相等则取出此Key的Value赋给目标类(当然还是用目标类此属性的set方法)。注意:如果是通过http请求的getParameterMap()得到的Map,其值是一个数组,一般只需要取第0项就可以了。

BeanUtils.copyProperties方法的源码限于篇幅,就不贴在此处了,有兴趣的可以百度一下或到我博客上去查看。

扩展后的copyProperties方法,这里为了表示和BeanUtils有“亲缘关系”,就新建了同名类并用同名方法,只是多做了一些处理,使其支持int/Integer、Date和自定义对象。限于篇幅只贴了核心代码,详细的可以访问我的博客:

http://blog.csdn.net/leadergg/archive/2008/12/11/3495586.aspx

 

/** 实现将源类(Map类型)属性拷贝到目标类中

 * @param Map map  源Map对象

 * @param Object obj  目标对象

* @auther <a href="mailto:gaoxuguo@feinno.com">Gao XuGuo</a>

 * 2009-11-30 13:11:29

 */

public static void copyProperties(Map map, Object obj) throws Exception {

    // 获取目标类的属性信息

    BeanInfo targetbean = Introspector.getBeanInfo(obj.getClass());

    PropertyDescriptor[] propertyDescriptors =targetbean.getPropertyDescriptors();

    // 对每个目标类的属性查找set方法,并进行处理

    for (int i = 0; i < propertyDescriptors.length; i++) {

        PropertyDescriptor pro = propertyDescriptors[i];

        Method wm = pro.getWriteMethod();

        if (wm != null) {

            Iterator ite =map.keySet().iterator();

            while (ite.hasNext()) {

                String key = (String)ite.next();

                // 判断匹配

                if(key.toLowerCase().equals(pro.getName().toLowerCase())) {

                    if (!Modifier.isPublic(wm.getDeclaringClass().getModifiers())){

                        wm.setAccessible(true);

                    }

                    Object value = ((String[])map.get(key))[0];

                    String pt = splitSpace(pro.getPropertyType().getName());

                    //判断类型是否匹配,不匹配则作强制转换

                    if (!(pt.equals(value.getClass().getName()))) {

                        value = parseByType(pro.getPropertyType(),value.toString());

                    }

                    // 调用目标类对应属性的set方法对该属性进行填充

                    wm.invoke((Object) obj, new Object[] {value});

                    break;

                }

            }

        }

    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值