目录

  • Bean Copy常见工具类
    • 硬编码
    • MapStruct(推荐)
    • cglib的BeanCopier
    • spring-beans的BeanUtils
    • apache的BeanUtils
  • 浅拷贝与深拷贝
    • 使用Object的clone()方法实现浅拷贝
    • 通过反序列化实现深拷贝

Bean Copy常见工具类

硬编码

手动get、set,性能最高,但写起来麻烦。

MapStruct(推荐)

  • 需要引入依赖、自行定义mapper接口;
  • 编译时自动生成硬编码方式的拷贝,性能几乎可以媲美硬编码;
  • 可以拷贝普通对象、Collection,不能拷贝Map;
  • 支持自定义转换,扩展性好;

使用可参考:https://blog.csdn.net/chy_18883701161/article/details/127916574

cglib的BeanCopier

  • 基于动态代理实现,性能不错;支持自定义转换器,可扩展;
  • 只能拷贝普通对象,不能拷贝Collection、Map
<dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>3.3.0</version>
</dependency>
//参数依次指定源类、目标类、是否使用转换器
BeanCopier beanCopier = BeanCopier.create(UserOrderBo.class, UserOrderVo.class, false);
//参数分别为source、target、转换器,返回值void,需要目标对象已存在
beanCopier.copy(userOrderBo, userOrderVo, null);

spring-beans的BeanUtils

  • 基于反射实现,性能一般;
  • 只能拷贝普通对象,不能拷贝Collection、Map
//参数依次指定source、target,返回值void,需要target已存在
BeanUtils.copyProperties(userBo, userVo);//可以指定要忽略的属性,参数个数可变
BeanUtils.copyProperties(userBo, userVo, "password", "tel");

apache的BeanUtils

基于反射实现,性能极差,避免使用

<dependency><groupId>commons-beanutils</groupId><artifactId>commons-beanutils</artifactId>
</dependency>

浅拷贝与深拷贝

拷贝都是新建目标类实例,浅拷贝、深拷贝的区别在于引用类型的成员字段的复制方式不同

  • 浅拷贝:字段都是直接拷贝引用(地址),和原成员字段指向的堆中的同一个对象,优点是开销小、速度快、性能好,缺点是通过其中一个引用修改堆中对象时,会影响到指向这个对象的其它引用;
  • 深拷贝:引用类型的成员变量会重新创建实例,开销大、速度慢,但更安全,可以避免共用堆中对象导致的问题。

以上介绍的几种bean copy方式都是浅拷贝,通常出于性能考虑,也是使用浅拷贝,除非特殊情况

使用Object的clone()方法实现浅拷贝

根类 Object 的 clone() 方法是 native 方法,速度快、性能高

//实现标记接口 Cloneable
public class User implements Cloneable {//修改访问权限为public,把返回值转换为具体类型,方法体中调用根类Object的clone()方法@Overridepublic User clone() throws CloneNotSupportedException {return (User) super.clone();}}

通过反序列化实现深拷贝

反序列化是深拷贝的,这也是实现深拷贝最常见的方式

/*** 操作对象的工具类*/
public class ObjectUtil {/*** 深拷贝对象** @param source 源对象* @param <T>    目标类型* @return 深拷贝得到的对象* @throws IOException, ClassNotFoundException*/public static <T> T deepClone(T source) throws IOException, ClassNotFoundException {//序列化源对象ByteArrayOutputStream baos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(baos);oos.writeObject(source);//反序列化得到新对象ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());ObjectInputStream ois = new ObjectInputStream(bais);T target = (T) ois.readObject();ois.close();oos.close();return target;}}

BeanCopy 常用工具类相关推荐

  1. commons-lang3-3.2.jar中的常用工具类的使用

    这个包中的很多工具类可以简化我们的操作,在这里简单的研究其中的几个工具类的使用. 1.StringUtils工具类 可以判断是否是空串,是否为null,默认值设置等操作: /*** StringUti ...

  2. commons-lang常用工具类StringEscapeUtils使用--转

    https://my.oschina.net/ydsakyclguozi/blog/341496 在apache commons-lang(2.3以上版本)中为我们提供了一个方便做转义的工具类,主要是 ...

  3. utils C/C++的常用工具类

    yaocoder/utils · GitHub utils C/C++的常用工具类 Common Utilities class and function (C/C++) src --algorith ...

  4. java file ip_java常用工具类 IP、File文件工具类

    本文实例为大家分享了java常用工具类的具体实现代码,供大家参考,具体内容如下 IP工具类 package com.jarvis.base.util; import java.io.IOExcepti ...

  5. javascript 总结(常用工具类的封装)(转)

    转载地址:http://dzblog.cn/article/5a6f48afad4db304be1e7a5f javascript 总结(常用工具类的封装) JavaScript 1. type 类型 ...

  6. apache-commons 常用工具类

    引用包说明 本文引用的所有包如下 <dependency><groupId>org.apache.commons</groupId><artifactId&g ...

  7. javascript 总结(常用工具类的封装,转)

    javascript 总结(常用工具类的封装) 前言 因为工作中经常用到这些方法,所有便把这些方法进行了总结. JavaScript 1. type 类型判断 isString (o) { //是否字 ...

  8. 6章:常用工具类以及函数

    2019独角兽企业重金招聘Python工程师标准>>> <div class="box"><div class="w_320" ...

  9. javascript常用工具类整理(copy)

    JavaScript常用工具类 类型 日期 数组 字符串 数字 网络请求 节点 存储 其他 1.类型 isString (o) { //是否字符串return Object.prototype.toS ...

最新文章

  1. 【Rsync项目实战一】备份全网服务器数据
  2. 用python赚零花钱_用Python拓展副业的几种方式
  3. 计算机系统的指令系统,计算机指令系统指的是什么呢?
  4. 左手手机右手智慧屏 华为9月要搞大事情
  5. java hibernate回滚_Spring Hibernate 测试事务不能回滚
  6. c语言编写的贪吃蛇代码,刚学C语言,想写一个贪吃蛇的代码
  7. 克服密集恐惧症,目标检测代你实现钢筋精准计数
  8. Atitit mybatis spring整合。读取spring、yml、文件的mysql url 步骤,读取yml,文件,使用ongl定位到url pwd usr 读取mybatis模板配置,
  9. 在惠普BL460C G1上安装System Management Homepage(CentO...
  10. linux各个目录作用详解,linux各个目录作用
  11. C/C++ FFmepeg Qt音视频开发录屏摄像机
  12. 红孩儿编辑器的渲染子系统的渲染模块的函数依赖关系图
  13. java同时引用不同版本同一个jar包
  14. Pandas基础入门知识点总结
  15. 如何选定搭建个人独立博客工具
  16. App马甲包开发需要注意的地方
  17. 友善之臂nanoPc T2
  18. 上线清单 —— 20 个 Laravel 应用性能优化项 1
  19. 微服务架构(一):什么是微服务(一)
  20. vue实现模拟象棋走子

热门文章

  1. opencv3学习:reshape函数
  2. 框架到底是什么,干什么的
  3. IO模型(阻塞,非阻塞,多路复用......)
  4. 查看表空间已使用和剩余空间大小
  5. 优秀的 DevOps Pro 需具备的7种基本软技能
  6. 【FFmpeg杂记】音频解码输出PCM格式数据分析
  7. Taro,小程序scroll-view 填满剩下的高度空间,关闭页面回跳(部分ios机型 滚动不到底部)
  8. Ubuntu 16.04 一系列软件安装命令,包括QQ、搜狗、Chrome、vlc、网易云音乐安装方法(转载)...
  9. powershell:调用7z,haozip解压缩文件
  10. Linux Kernel 6.0 CXL Core pci.c 详解