使用BeanCopier工具类拷贝JavaBean
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相关推荐
- BeanCopier工具类
import org.springframework.cglib.beans.BeanCopier; import org.springframework.cglib.core.Converter; ...
- Java 对象copy之BeanCopier工具类的使用
对象拷贝的应用现状简介: 业务系统中经常需要两个对象进行属性的拷贝,不能否认逐个的对象拷贝是最快速最安全的做法,但是当数据对象的属性字段数量超过程序员的容忍的程度,代码因此变得臃肿不堪,使用一些方便的 ...
- 一个封装的BeanCopier工具类
工具类BeanCopierUtils 1. 支持source对象到target对象的拷贝 2. 支持List<S> source到 List<T> target的拷贝 impo ...
- Cglib BeanCopier工具类
目录 前言 上代码 解析 github地址 前言 一般大家都会使用BeanUtils.copyProperties来复制对象,不过Cglib更快 所以今晚熬夜把这个工具类也封装一下,由于在创建Bean ...
- Hutool中 常用的工具类和方法
文章目录 一.Hutool是什么? 二.安装 三.常用工具类 日期时间工具类 DateUtil 日期时间对象-DateTime 类型转换工具类 Convert 字符串工具类 StrUtil 数字处理工 ...
- java spring文件下载_SpringMVC实现文件上传和下载的工具类
本文主要目的是记录自己基于SpringMVC实现的文件上传和下载的工具类的编写,代码经过测试可以直接运行在以后的项目中. 开发的主要思路是对上传和下载文件进行抽象,把上传和下载的核心功能抽取出来分装成 ...
- 常用工具类 (三) : Hutool 常用工具类整理 (全)
文章目录 官方文档 一.基础工具类 StrUtil / StringUtils 字符串工具类 DateUtil 日期工具类 NumberUtil 数字工具类 BeanUtil JavaBean工具类 ...
- JavaSE(字符流、IO资源的处理、属性集、ResourceBundle工具类、缓冲流、转换流、序列化、打印流、装饰设计模式、commons-io工具包)
JavaSE 字符流 字符输入流[Reader] 字符输入流Reader类的概述 字符输入流Reader类的常用方法 FileReader类 FileReader类的概述 FileReader类的构造 ...
- 【日常代码记录】如何实现一个beancopier的工具类?
新建一个BeanCopierUtil工具类,源码如下: import java.util.ArrayList; import java.util.List; import java.util.conc ...
最新文章
- 图像处理之简单脸谱检测算法
- 设计模式(九)--注册树模式
- Mac OS使用技巧之十三:Finder中标记的使用
- java自定义异常实验总结,Java实验--自定义异常的使用
- origin 修改水平坐标的刻度
- linux备份用户设置,Linux配置备份
- 【mysql乱码】解决php中向mysql插入中文数据乱码的问题
- 以用户为中心的SNS站点数据库设计及实现
- python获取局域网通过guest开放的软件_python构建SSH僵尸网络
- mysql报错:You must at least set –server-id to enable either a master or a slave
- Use Jet OLE DB Provider 4.0 to Connect to ISAM Databases (连接Excel, Text等数据库)
- PyQt5--google快捷翻译
- dvwa最详细安装过程
- java f5 f6_eclipse debug常见调试 F6 单步 F8完成 F5进入方法
- 如何用cocos2d-x来开发简单的Uphone游戏:(三) 射击子弹 碰撞检测
- 用 python 来操作 docx(使用 docx 库操作 docx 格式文件)
- 微信小程序登录流程 微信登录
- 弘辽科技:拼多多改销量是什么意思?
- python maketrans函数_maketrans函数
- ps教程之后期妆容攻略