BeanUtil.copyProperties的小坑

最近,鄙人在项目开发中需要用到对象复制之类的功能,所以很自然就想到copyProperties这个方法。

先来简单介绍一下:BeanUtils提供对Java反射和自省API的包装。其主要目的是利用反射机制对JavaBean的属性进行处理。如果你有两个甚至需要很多个 具有很多相同属性的JavaBean,那创建时候不是要不断重复赋值,而我们使用 BeanUtils.copyProperties() 方法以后,代码量大大的减少,而且整体程序看着也简洁明朗。

其中简单的方法包含很多坑:

坑位1:

两个不同的包(springframework , apache)中有一个相同名字的类,相同的方法,方法的作用相同,参数个数相同。

就是参数位置不同 - -!

package org.springframework.beans;中的

BeanUtils.copyProperties(A,B);

是A中的值赋给B

package org.apache.commons.beanutils;

BeanUtils.copyProperties(A,B);

是B中的值赋给A


坑位2:

场景:需要对某个集合中的所有元素拷贝到另一个集合中,想着BeanUtils.copyProperties()可以深拷贝对象,误以为也可以拷贝集合,于是乎写下了如下代码

List ruleList = Lists.newArrayList();

 BeanUtils.copyProperties(partList, ruleList );

以上的操作结果不会报错,但是 ruleList 集合仍是一个空集合

BeanUtils.copyProperties只对bean属性进行复制,这里的复制属于浅复制。且不能复制集合和数组。BeanUtils.copyProperties利用反射,直接将对象的引用set进去,并不是深拷贝。

而且有一点:对于spring的beanUtils复制,如果对象的属性是继承并且重定义了属性,反射会copy不过去。

坑位3:

由于这些BeanUtils类都是采用反射机制实现的,对程序的效率也会有影响。因此,慎用BeanUtils.copyProperties!!!

除BeanUtils外还有一个名为PropertyUtils的工具类,它也提供copyProperties()方法,作用与BeanUtils的同名方法十分相似,主要的区别在于后者提供类型转换功能,即发现两个JavaBean的同名属性为不同类型时,在支持的数据类型范围内进行转换,而前者不支持这个功能,但是速度会更快一些。

汗,我还是自己set吧。。。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文所提到的类库已经开源到GITHUB,读者可下载源码并提宝贵意见。 转载请注明出处: http://www.ji...
    TuYang阅读 19,631评论 6 23
  • 目的 一个JavaBean通常包含了大量的属性,很多情况下,对JavaBean的处理导致大量get/set代码堆积...
    勿念及时雨阅读 1,191评论 2 6
  • 对象拷贝 对象拷贝分为深拷贝和浅拷贝。根据使用场景进行不同选择。在Java中,数据类型分为值类型(基本数据类型)和...
    意识流丶阅读 2,504评论 1 14
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 7,601评论 16 22
  • 创业是很多人的梦想,多少人为了理想和不甘选择了创业来实现自我价值,我就是其中一个。 创业后,我由女人变成了超人,什...
    亦宝宝阅读 1,909评论 4 1