最近,鄙人在项目开发中需要用到对象复制之类的功能,所以很自然就想到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吧。。。
网友评论