您的位置:首页 > 其它

BeanUtils拷贝属性容易忽视的坑

2017-05-13 12:31 162 查看
使用BeanUtils对两个对象进行属性拷贝(浅拷贝),方便快捷,减少了开发量,提高了开发效率,但是使用的时候要着重考虑下此处是否真的能用。

例如:

public class TestCopy {
public static void main(String[] args) {
Test test1 = new Test();
Test test2 = new Test();
test1.setA("a1");
//      test1.setB(1f);
test2.setA("a2");
test2.setB(2f);
BeanUtils.copyProperties(test1, test2);
System.out.println(test2.getA());
System.out.println(test2.getB());
}

}

class Test {
private String a;
private Float b;
public String getA() {
return a;
}
public void setA(String a) {
this.a = a;
}
public Float getB() {
return b;
}
public void setB(Float b) {
this.b = b;
}

}


用test1的属性覆盖test2的属性,但是当test1某属性为null时,我不希望test2的属性值丢失,相信这种场景大家也会经常遇到,比如前端修改一个对象,把修改后的对象传到后台,后台需要用这个对象更新持久层的实体,但是前端通常不可能将持久层实体涉及的所有属性都传到后台(因为有些属性是对前端屏蔽的,前端根本拿不到),这个时候如果使用BeanUtils直接拷贝,那么恭喜你,你的持久层数据被更新坏了

那么为什么会出现这个问题呢,我们以org.springframework.beans.BeanUtils为例,看下它的源码是如何实现的



第一个红框校验了源对象中是否有目标对象中需要更新的某属性,如果有就往下执行了

第二个红框从原对象中把该属性值取出,然后设置到目标对象中相应属性上

对比了其他几种BeanUtils源码(此处就不贴了),大体上都是这个思路,并不会检查原对象的属性是否为null,我想这可能是因为BeanUtils拷贝属性的设计初衷就是null也是一种属性值的状态,但是我们在使用的时候一定要根据自己的使用场景,谨慎使用!谨慎使用!谨慎使用!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: