使用BeanUtils拷贝

8人阅读 评论(0) 收藏 举报
分类:

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

查看评论

微信公众号使用

微信公众号使用,是一套基础课程,为后面的《PHP微信公众号开发》做铺垫。微信几乎是智能手机上必装的软件,很多的商家在微信上开通公众号,想要把公众号的价值发挥最大,必须学会公众号的使用,开发和营销。这一套课程重点教你学会公众号的使用,为后面的做好基础。欢迎反馈,QQ/微信:68183131
  • 2016年06月24日 14:48

慎用BeanUtils的对象拷贝方法

javaWeb开发过程中,经常需要在领域类之间进行实体对象的拷贝操作,比如把Po类的属性值拷贝给Dto类。BeanUtils这种工具类应用而生,比如org.apache.commons包中的BeanU...
  • q649381130
  • q649381130
  • 2017-09-22 16:48:42
  • 915

BeanUtils拷贝属性容易忽视的坑

使用BeanUtils对两个对象进行属性拷贝不得不注意的坑!坑!坑!
  • qq_21033663
  • qq_21033663
  • 2017-05-13 12:31:17
  • 5595

使用BeanUtils方法拷贝不上问题

最近在项目中,发现BeanUtils.copyProperties方法拷贝bean属性时候,有的时候会失效。最后发现是由于项目中引用了spring和common两个包,都有BeanUtils方法,错误...
  • alen1985
  • alen1985
  • 2012-12-19 16:43:52
  • 2521

Bean属性复制:Apache BeanUtils、PropertyUtils,Spring BeanUtils,Cglib BeanCopier

1、比较: 1)apache和spring的BeanUtils都是使用了反射机制,所以效率一般。spring的效率要高于Apache(Apache相当的耗费资源!) 2)cglib使用动态代理原理...
  • liuxiao723846
  • liuxiao723846
  • 2016-07-20 11:15:16
  • 1148

对象拷贝工具类BeanutilsCopy

mport java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util....
  • wochunyang
  • wochunyang
  • 2016-04-28 23:43:32
  • 795

扩展spring的BeanUtils,增加拷贝属性排除null值的功能(注:String为null不考虑)

public class BeanUtils extends org.springframework.beans.BeanUtils { public static void copyNot...
  • qq_32447321
  • qq_32447321
  • 2016-11-27 20:49:16
  • 1441

java使用第三方工具BeanUtils实现对象的复制

1.为什么要使用BeanUtils组件? 由于我们经常操作javabean,很频繁的get和set来实现属性的复制,apache提供了这个BeanUtils来实现直接对象的拷贝。 2.BeanUtil...
  • ya_1249463314
  • ya_1249463314
  • 2016-10-17 23:53:11
  • 9187

让BeanUtils的copyProperty方法支持String与java.util.Date的类型转换

刚开始使用BeanUtils的copyProperties的bean属性复制方法结果发现它复制属性的时候,只支持java.sql.Date与String的类型转换,但是由于我们的pojo是使用java...
  • fableking
  • fableking
  • 2008-07-12 16:29:00
  • 7508

Apache Commons Beanutils对象属性批量复制(pseudo-singleton)

Apache Commons Beanutils为开源,可在Apache官网http://commons.apache.org/proper/commons-beanutils/download_be...
  • a19881029
  • a19881029
  • 2014-02-13 20:02:02
  • 6905
    个人资料
    持之以恒
    等级:
    访问量: 4744
    积分: 305
    排名: 24万+
    文章存档
    最新评论