BeanUtils.copyProperties_java copyproperties

BeanUtils.copyProperties_java copyproperties这里说的是spring的BeanUtils.copyProperties。场景开发中经常遇到,把父类的属性拷贝到子类中。通常有2种方法:1、一个一个set2、用BeanUtils.copyProperties很显然BeanUtils更加方便,也美观很多。那么任何情况都能使用BeanUtils么,当然不是。要先了解他。是深拷贝,还是浅拷贝?是浅拷贝。浅拷贝:只是调用子对象的set…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

这里说的是spring的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是正好相反的,要特别留意。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/186150.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • WLS

    WLS来源:https://docs.o-ran-sc.org/projects/o-ran-sc-o-du-phy/en/latest/wls-lib.htmlWls_lib是英特尔开元的一个无线服务

    2022年8月3日
    7
  • js 数组转json和json转数组

    js 数组转json和json转数组js数组转json和json转数组数组转json串json字符串转数组数组转json串vararr=[1,2,3,{a:1}];JSON.stringify(arr);json字符串转数组varjsonStr='[1,2,3,{“a”:1}]’;JSON.parse(jsonStr);

    2022年6月21日
    29
  • Day5- php 特殊类型 资源 NULL

    Day5- php 特殊类型 资源 NULL

    2021年9月15日
    52
  • 常见分布式文件存储介绍、选型比较、架构设计

    常见分布式文件存储介绍、选型比较、架构设计Hello,我是瓜哥:之前在进行对接存储项目的时候,对公司内部使用的文件系统进行了梳理,当前公司内部使用的文件系统有GlusterFS,FastDFS等,由于文件系统在海量小文件和高并发之下性能急剧下降,性能遭遇瓶颈,因此打算建设分布式对象存储平台。下面对市面上比较流行的非结构化文件存储产品进行相关整理和比较。分布式文件存储的来源在这个数据爆炸的时代,产生的数据量不断地在攀升,从GB,…

    2022年6月10日
    46
  • wireshark抓包使用教程

    wireshark抓包使用教程Wireshark是非常流行的网络封包分析软件,可以截取各种网络数据包,并显示数据包详细信息。常用于开发测试过程各种问题定位。本文主要内容包括:1、Wireshark软件下载和安装以及Wireshark主界面介绍。2、WireShark简单抓包示例。通过该例子学会怎么抓包以及如何简单查看分析数据包内容。3、Wireshark过滤器使用。通过过滤器可以筛选出想要分析的内容。包括按照协议过滤、端口和主机名过滤、数据包内容过滤。Wireshark软件安装软件下载路径:w…

    2025年9月25日
    4
  • echo -ne(echo line)

    echo[-ne][字符串]或echo[–help][–version]  补充说明:echo会将输入的字符串送往标准输出。输出的字符串间以空白字符隔开,并在最后加上换行号。  参  数:-n不要在最后自动换行       -e若字符串中出现以下字符,则特别加以处理,而不会将它当成一般        文字输出:        \a发出警告声;       

    2022年4月11日
    79

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号