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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • java冒泡排序经典代码_Java干货分享:冒泡排序

    java冒泡排序经典代码_Java干货分享:冒泡排序不管学习什么编程语言,冒泡排序都是每一个走上IT路的小伙伴的必经之路。但是还有好多小伙伴对冒泡排序摸不着头脑,今天知了堂小编就来分享一下经典算法——冒泡排序。首先咱们举个金鱼吐泡泡的例子来理解冒泡排序的过程:金鱼吐出的一连串泡泡就是我们要排序的数据,数据就像泡泡浮上水面一样一个一个被排好序,吐出的泡泡越大就会越快浮出水面,相应的,数据里某一个数字越大,那么就能越快的被排好序,当然最大的数字也是第一…

  • UnicodeEncodeError: ‘gbk’ codec can’t encode character ‘\U0001f914’ in posit[通俗易懂]

    UnicodeEncodeError: ‘gbk’ codec can’t encode character ‘\U0001f914’ in posit[通俗易懂]原码#保存爬取结果(微博评论)result.to_csv(‘egg_comment.csv’,encoding=’gbk’)报错UnicodeEncodeError:’gbk’codeccan’tencodecharacter’\U0001f914’inposit原因网上很多内容都是采用utf8编码的,gbk无法编码字符’\U0001f914’,所以’utf8’格式…

  • Oracle number类型的语法和用法

    Oracle number类型的语法和用法Oraclenumber类型的语法和用法2012-10-2910:37:08    我来说两句     作者:liwenshui322收藏  我要投稿Oraclenumber类型的语法和用法    number类型的语法很简单,就是:   number(p,s)   p,s都是可选的,假如都不填,p默认为38,s默认为-48~127。

  • DIV滚动条显示

    DIV滚动条显示DIV滚动条所谓DIV滚动条,就是利用DIV标签,在里面嵌入CSS样式表,加入overflow的属性值,这样,当div所规范的区域内的内容达到一定程序时,滚动条就派上用场1、滚动条常用属性:overflow:auto为自动,scroll为出现滚动条overflow-x:横向滚动条overflow-y:纵向滚动条代码样例:  这里是你要显示的内容,只有需要时才出现滚动条。  这里是你要显示的内容,无论是否需要都出现滚动条。

  • 语音信号处理——线性预测编码LPC「建议收藏」

    语音信号处理——线性预测编码LPC「建议收藏」语音信号处理二:干净语音的特征提取:今天的信号与系统,DSP知识点参考SpokenLanguageProcessing第5,6章LPC方程的Durbin算法推导:语音信号数字处理(杨行峻,迟惠生)第四章,数字语音处理(Rabiner)第九章作业是自己实现语音信号的LPC预测算法:输入一段语音信号,选定不同阶数p,在最小二乘准则下,用自相关法估计预测系数aia_iai​,对比重建语…

  • 基于豆瓣影评数据的文本分析系统【数据爬取+数据清洗+数据库存储+LDA主题挖掘+词云可视化】「建议收藏」

    基于豆瓣影评数据的文本分析系统【数据爬取+数据清洗+数据库存储+LDA主题挖掘+词云可视化】「建议收藏」本分析中很多的工作都是基于评论数据来进行的,比如:滴滴出行的评价数据、租房的评价数据、电影的评论数据等等,从这些语料数据中能够挖掘出来客户群体对于某种事物或者事情的看法,较为常见的工作有:舆情分析、热点挖掘和情感分析。如果想要了解关于文本分类或者是情感分析相关的工作内容,可以阅读我的《数据建模实战》专栏文章,下面是链接信息:…

发表回复

您的电子邮箱地址不会被公开。

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