Java BeanUtils.copyProperties的详解

 更新时间:2021年08月11日 09:52:59   作者:chushiyunen  
这篇文章主要介绍了Java BeanUtils.copyProperties的详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

场景

开发中经常遇到,把父类的属性拷贝到子类中。通常有2种方法:
1、一个一个set
2、用BeanUtils.copyProperties
很显然BeanUtils更加方便,也美观很多。
那么任何情况都能使用BeanUtils么,当然不是。要先了解他。

BeanUtils是深拷贝,还是浅拷贝?

是浅拷贝。
浅拷贝: 只是调用子对象的set方法,并没有将所有属性拷贝。(也就是说,引用的一个内存地址)
深拷贝: 将子对象的属性也拷贝过去。

什么情况适合用BeanUtils

如果都是单一的属性,那么不涉及到深拷贝的问题,适合用BeanUtils。

有子对象就一定不能用BeanUtils么

并不绝对,这个要区分考虑:
1、子对象还要改动。
2、子对象不怎么改动。
虽然有子对象,但是子对象并不怎么改动,那么用BeanUtils也是没问题的。

代码例子

下面用代码说明下。
翠山有个儿子无忌,儿子继承了他的face和height。
但是life应该是自己的。
后来翠山自刎而死,无忌也变成dead状态了。这就是浅拷贝,无忌用的life引用的翠山的life对象。

Father类:

@Data
public class Father {
    private String face; // 长相
    private String height; // 身高
    private Life life; // 生命
}

Life 类:

@Data
public class Life {
    private String status;
}

Son类和main方法:

@Data
public class Son extends Father{
    private Life life;

    public static void main(String[] args) {
        Father cuishan = new Father();
        cuishan.setFace("handsome");
        cuishan.setHeight("180");
        Life cuishanLife = new Life();
        cuishanLife.setStatus("alive");
        cuishan.setLife(cuishanLife);
        Son wuji=new Son();
        BeanUtils.copyProperties(cuishan,wuji);

//        Life wujiLife = wuji.getLife();
//        wujiLife.setStatus("alive");
//        wuji.setLife(wujiLife);
//        cuishanLife.setStatus("dead"); // 翠山后来自刎了

        System.out.println(JSON.toJSONString(cuishan));
        System.out.println(JSON.toJSONString(wuji));
    }
}

上面注释出的代码可以如下替换:
case1和case2还是受浅拷贝的影响,case3不受。
case1: 翠山自刎,无忌也挂了

//        Life wujiLife = wuji.getLife();
//        wujiLife.setStatus("alive");
//        wuji.setLife(wujiLife);
//        cuishanLife.setStatus("dead"); // 翠山后来自刎了

case2: 翠山自刎,无忌设置或者,翠山也活了

//        cuishanLife.setStatus("dead"); // 翠山后来自刎了
//        Life wujiLife = wuji.getLife();
//        wujiLife.setStatus("alive");
//        wuji.setLife(wujiLife);

case3: 翠山和无忌互不影响

	    cuishanLife.setStatus("dead"); // 翠山自刎了  该行放在上下均可
        // 无忌用个新对象 不受翠山影响了
        Life wujiLife = new Life();
        wujiLife.setStatus("alive");
        wuji.setLife(wujiLife);

dest ,src 还是 src,dest

笔者在这个爬过坑。
因为记得有beanutils这个工具,直接import了。
发现有copyProperty和copyProperties。 看了下发现是 dest,src ,于是果断使用,结果发现参数没了。

其实常见的BeanUtils有2个:
spring有BeanUtils
apache的commons也有BeanUtils。

区别如下:

spring的BeanUtils commons的BeanUtils
方法 copyProperty和copyProperties copyProperties
参数 src ,dest dest,src

这2个用哪个都行,但是要注意区别。 因为他们2个的src和dest是正好相反的,要特别留意。

到此这篇关于Java BeanUtils.copyProperties的详解的文章就介绍到这了,更多相关Java BeanUtils.copyProperties内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中的synchronized关键字

    Java中的synchronized关键字

    这篇文章主要介绍了Java中的synchronized关键字,synchronized可以保证方法或代码块在运行时,同一时刻只有一个线程可以进入到临界区(互斥性),同时它还保证了共享变量的内存可见性,下面我们就来看看你文章对synchronized锁的介绍,需要的朋友也可以参考一下
    2021-12-12
  • Spring实战之让Bean获取Spring容器操作示例

    Spring实战之让Bean获取Spring容器操作示例

    这篇文章主要介绍了Spring实战之让Bean获取Spring容器操作,结合实例形式分析了Bean获取Spring容器的相关原理、实现方法及操作注意事项,需要的朋友可以参考下
    2019-11-11
  • Solr通过特殊字符分词实现自定义分词器详解

    Solr通过特殊字符分词实现自定义分词器详解

    最近因为工作的需要,要做一个分词器,通过查找相关的资料最终用solr实现了,下面这篇文章主要给大家介绍了关于Solr通过特殊字符分词实现自定义分词器的相关资料,需要的朋友可以参考借鉴,下面随着小编来一起看看吧。
    2017-09-09
  • java学生信息管理系统MVC架构详解

    java学生信息管理系统MVC架构详解

    这篇文章主要为大家详细介绍了java学生信息管理系统MVC架构的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • Struts2学习笔记(7)-访问Web元素

    Struts2学习笔记(7)-访问Web元素

    这篇文章主要介绍Struts2中访问Web元素的方法,希望能给大家做一个参考。
    2016-06-06
  • Java基础第三篇 构造器与方法重载

    Java基础第三篇 构造器与方法重载

    显式初始化要求我们在写程序时就确定初始值,这有时很不方便。我们可以使用构造器(constructor)来初始化对象。构造器可以初始化数据成员,还可以规定特定的操作。这些操作会在创建对象时自动执行。下面文字将对该内容做详细介绍,需要的小伙伴请参考
    2021-09-09
  • Java8中如何通过方法引用获取属性名详解

    Java8中如何通过方法引用获取属性名详解

    这篇文章主要给大家介绍了关于Java8中如何通过方法引用获取属性名的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Java之SpringCloudAlibaba Sentinel组件案例讲解

    Java之SpringCloudAlibaba Sentinel组件案例讲解

    这篇文章主要介绍了Java之SpringCloudAlibaba Sentinel组件案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • 排查Java应用内存泄漏问题的步骤

    排查Java应用内存泄漏问题的步骤

    这篇文章主要介绍了排查Java应用内存泄漏问题的步骤,帮助大家更好的理解和学习Java,感兴趣的朋友可以了解下
    2020-11-11
  • MyBatis实现万能Map和模糊查询

    MyBatis实现万能Map和模糊查询

    本文主要介绍了MyBatis实现万能Map和模糊查询,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2021-07-07

最新评论