BeanUtils.copyProperties的使用(深拷贝,浅拷贝)


prtyaa
prtyaa 2023-12-31 21:23:52 57559 赞同 0 反对 0
分类: 资源
场景 开发中经常遇到,把父类的属性拷贝到子类中。通常有2种方法: 一个一个set 用BeanUtils.copyProperties 很显然BeanUtils更加方便,也美观很多。 那么任何情况都能使用BeanUtils么,当然不是。要先了解他

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

是浅拷贝。

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

什么情况适合用BeanUtils

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

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

并不绝对,这个要区分考虑:

  • 子对象还要改动。
  • 子对象不怎么改动。

虽然有子对象,但是子对象并不怎么改动,那么用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个:s- pring有BeanUtils

  • apache的commons也有BeanUtils。

区别如下:

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

如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!

评价 0 条
prtyaaL2
粉丝 1 资源 1949 + 关注 私信
最近热门资源
分享如何在银河麒麟高级服务器操作系统V10SP3中需要启用内核审计功能。  176
分享免费开源高速下载器  171
一图对比分析IPv4与IPv6  167
统信uos家庭版与专业版的选择  166
分享如何查看网卡中断的数量  163
解决银河麒麟无法添加惠普打印机,提示'client-error-not-possible'.”错误  162
winrar绿色无广告版分享  154
通过shell脚本在统信UOS/麒麟系统中安装nginx  145
分享在麒麟系统中关闭占用端口的进程的办法  142
统信UOS常见问题小总结  142
最近下载排行榜
分享如何在银河麒麟高级服务器操作系统V10SP3中需要启用内核审计功能。 0
分享免费开源高速下载器 0
一图对比分析IPv4与IPv6 0
统信uos家庭版与专业版的选择 0
分享如何查看网卡中断的数量 0
解决银河麒麟无法添加惠普打印机,提示'client-error-not-possible'.”错误 0
winrar绿色无广告版分享 0
通过shell脚本在统信UOS/麒麟系统中安装nginx 0
分享在麒麟系统中关闭占用端口的进程的办法 0
统信UOS常见问题小总结 0
作者收入月榜
1

prtyaa 收益395.97元

2

zlj141319 收益228.47元

3

IT-feng 收益214.92元

4

1843880570 收益214.2元

5

风晓 收益208.24元

6

777 收益173.02元

7

哆啦漫漫喵 收益131.6元

8

Fhawking 收益106.6元

9

信创来了 收益105.97元

10

克里斯蒂亚诺诺 收益91.08元

请使用微信扫码

加入交流群

请使用微信扫一扫!