使用BeanUtils拷贝

使用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也是一种属性值的状态,但是我们在使用的时候一定要根据自己的使用场景,谨慎使用!谨慎使用!谨慎使用!

阅读更多

没有更多推荐了,返回首页