JavaBean拷贝

深拷贝和浅拷贝概念

浅拷贝 Shallow Copy

对基本类型的属性会进行值传递,当修改其中一个对象中的属性时,不会影响另一个对象中的属性
对引用数据的属性,比如数组或某类对象,会进行引用传递,及两个对象中的属性指向同一个实例对象,修改对象会相互影响。

深拷贝 Deep Copy

深拷贝就是对引用类型的数据,也进行拷贝,开辟新的内存空间,两个bean之间相互修改自己的属性不产生影响。

开源工具类

  • apache的BeanUtils 原理-反射
  • apache的PropertyUtils 原理-反射
  • spring的BeanUtils 原理-反射
  • cglib的BeanCopier 原理-动态代理,性能很高,是反射的几十倍或数百倍

说明:反射的性能很差,有人做过这几种拷贝工具的性能测试,发现通过反射实现的功能性能很差,不建议在生产环境使用

BeanCopiers使用说明

注意事项

BeanCopier只有在属性名称和类型都相同的情况下才会进行copy。

工具类用例1(使用同步锁)
/*** BeanCopier工具类, 运用了享元模式进行实现** @author icetea*/
public class BeanCopierUtils {/*** BeanCopier缓存(享元模式)*/private static Map<String, BeanCopier> beanCopierCacheMap = new HashMap<>();/*** 将source对象的属性拷贝到target对象中去** @param source source对象* @param target target对象*/public static void copyProperties(Object source, Object target) {String cacheKey = source.getClass().toString() + target.getClass().toString();BeanCopier beanCopier = null;// 为了线程安全使用双重锁机制if (!beanCopierCacheMap.containsKey(cacheKey)) {synchronized (BeanCopierUtils.class) {if (!beanCopierCacheMap.containsKey(cacheKey)) {// 进入到这里会创建一个BeanCopier实例并且放在缓存map中beanCopier = BeanCopier.create(source.getClass(), target.getClass(), false);beanCopierCacheMap.put(cacheKey, beanCopier);} else {beanCopier = beanCopierCacheMap.get(cacheKey);}}} else {beanCopier = beanCopierCacheMap.get(cacheKey);}beanCopier.copy(source, target, null);}
}
工具类用例1(使用jdk8的concurrentHashMap)
/*** BeanCopier工具类, 运用了享元模式进行实现** @author icetea*/
public class BeanCopierUtils {/*** BeanCopier缓存(享元模式)*/private static final Map<String, BeanCopier> BEAN_COPIER_MAP = new ConcurrentHashMap<>();/*** 将source对象的属性拷贝到target对象中去** @param source source对象* @param target target对象*/public static void copyProperties(Object source, Object target) {String cacheKey = source.getClass().toString() + target.getClass().toString();// 查看concurrentHashMap的实现方法介绍可以得知该方法为原子方法,保证了线程安全BeanCopier beanCopier = BEAN_COPIER_MAP.computeIfAbsent(cacheKey, k -> BeanCopier.create(source.getClass(), target.getClass(), false));beanCopier.copy(source, target, null);}
}

使用BeanCopier工具类拷贝JavaBean相关推荐

  1. BeanCopier工具类

    import org.springframework.cglib.beans.BeanCopier; import org.springframework.cglib.core.Converter; ...

  2. Java 对象copy之BeanCopier工具类的使用

    对象拷贝的应用现状简介: 业务系统中经常需要两个对象进行属性的拷贝,不能否认逐个的对象拷贝是最快速最安全的做法,但是当数据对象的属性字段数量超过程序员的容忍的程度,代码因此变得臃肿不堪,使用一些方便的 ...

  3. 一个封装的BeanCopier工具类

    工具类BeanCopierUtils 1. 支持source对象到target对象的拷贝 2. 支持List<S> source到 List<T> target的拷贝 impo ...

  4. Cglib BeanCopier工具类

    目录 前言 上代码 解析 github地址 前言 一般大家都会使用BeanUtils.copyProperties来复制对象,不过Cglib更快 所以今晚熬夜把这个工具类也封装一下,由于在创建Bean ...

  5. Hutool中 常用的工具类和方法

    文章目录 一.Hutool是什么? 二.安装 三.常用工具类 日期时间工具类 DateUtil 日期时间对象-DateTime 类型转换工具类 Convert 字符串工具类 StrUtil 数字处理工 ...

  6. java spring文件下载_SpringMVC实现文件上传和下载的工具类

    本文主要目的是记录自己基于SpringMVC实现的文件上传和下载的工具类的编写,代码经过测试可以直接运行在以后的项目中. 开发的主要思路是对上传和下载文件进行抽象,把上传和下载的核心功能抽取出来分装成 ...

  7. 常用工具类 (三) : Hutool 常用工具类整理 (全)

    文章目录 官方文档 一.基础工具类 StrUtil / StringUtils 字符串工具类 DateUtil 日期工具类 NumberUtil 数字工具类 BeanUtil JavaBean工具类 ...

  8. JavaSE(字符流、IO资源的处理、属性集、ResourceBundle工具类、缓冲流、转换流、序列化、打印流、装饰设计模式、commons-io工具包)

    JavaSE 字符流 字符输入流[Reader] 字符输入流Reader类的概述 字符输入流Reader类的常用方法 FileReader类 FileReader类的概述 FileReader类的构造 ...

  9. 【日常代码记录】如何实现一个beancopier的工具类?

    新建一个BeanCopierUtil工具类,源码如下: import java.util.ArrayList; import java.util.List; import java.util.conc ...

最新文章

  1. 图像处理之简单脸谱检测算法
  2. 设计模式(九)--注册树模式
  3. Mac OS使用技巧之十三:Finder中标记的使用
  4. java自定义异常实验总结,Java实验--自定义异常的使用
  5. origin 修改水平坐标的刻度
  6. linux备份用户设置,Linux配置备份
  7. 【mysql乱码】解决php中向mysql插入中文数据乱码的问题
  8. 以用户为中心的SNS站点数据库设计及实现
  9. python获取局域网通过guest开放的软件_python构建SSH僵尸网络
  10. mysql报错:You must at least set –server-id to enable either a master or a slave
  11. Use Jet OLE DB Provider 4.0 to Connect to ISAM Databases (连接Excel, Text等数据库)
  12. PyQt5--google快捷翻译
  13. dvwa最详细安装过程
  14. java f5 f6_eclipse debug常见调试 F6 单步 F8完成 F5进入方法
  15. 如何用cocos2d-x来开发简单的Uphone游戏:(三) 射击子弹 碰撞检测
  16. 用 python 来操作 docx(使用 docx 库操作 docx 格式文件)
  17. 微信小程序登录流程 微信登录
  18. 弘辽科技:拼多多改销量是什么意思?
  19. python maketrans函数_maketrans函数
  20. ps教程之后期妆容攻略

热门文章

  1. SQL Server 处理百万级以上的数据处理与优化
  2. 爆肝总结了面试套路,2W字长文!
  3. linux 挂载磁盘
  4. 方舟加入服务器显示lnvalid,方舟:生存进化 更新180.4后打怪无效解决方法
  5. 2603: 2012世界末日
  6. 企微SCRM系统助力在线教育行业做好社群SOP运营
  7. python_接口自动化测试框架
  8. vim的常用命令常规操作
  9. 电脑开关机的正确操作。
  10. PHP入门-函数的定义与使用