在开发过程中经常需要深度复制对象,才用Spring的BeanCopier方案是个不错的选择。

直接看代码,先准备好实体类。

import lombok.Data;import java.io.Serializable;
import java.util.Date;@Data
public class UserBean implements Serializable {private static final long serialVersionUID = -6952319891279734655L;private NameBean name;private String phone;private String sex;private int age;private Date birthdate;private long money;private Date createTime;private String createUser;private Date modifyTime;private String modifyUser;private String isValidate;private String comments;
}
import lombok.Data;
import java.io.Serializable;
import java.util.Date;@Data
public class NameBean implements Serializable {private static final long serialVersionUID = -2023200990550843496L;private String firstName;private String lastName;private Date createTime;private String createUser;private Date modifyTime;private String modifyUser;private String isValidate;private String comments;
}
import lombok.Data;import java.beans.Transient;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;@Data
public class StudentBean {private List<String> listTitle = new ArrayList<String>();{listTitle.add("Spring");listTitle.add("Java");}private String name;private String addr;private String sex;private int age;private Date birthdate;private Date createTime;private String createUser;private Date modifyTime;private String modifyUser;private String isValidate;private String comments;private NameBean nameBean;}
import org.springframework.cglib.beans.BeanCopier;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Consumer;
import java.util.function.UnaryOperator;public class CGlibMapper {//使用缓存提高效率private static final ConcurrentHashMap<String, BeanCopier> mapCaches = new ConcurrentHashMap<>();/****  通过类复制属性(同一个类其实就是克隆自己)  属性相同才能复制* @param source  需要复制的对象* @param target 目标类* @param <O>* @param <T>* @return*/public static <O, T> T mapper(O source, Class<T> target) {return baseMapper(source, target);}/***  通过类复制属性(同一个类其实就是克隆自己)  属性相同才能复制* @param source  需要复制的对象* @param target 目标类* @param action  支持lambda操作* @param <O>* @param <T>* @return*/public static <O, T> T mapper(O source, Class<T> target, Consumer<T> action) {T instance = mapper(source,target);action.accept(instance);return instance;}/***  通过类复制属性(同一个类其实就是克隆自己)  属性相同才能复制* @param source  需要复制的对象* @param target 目标类* @param action  支持lambda操作* @param <O>* @param <T>* @return*/public static <O, T> T mapper(O source, Class<T> target, UnaryOperator<T> action) {T instance = mapper(source,target);return action.apply(instance);}/**** 通过对象复制属性(同一个类其实就是克隆自己)  属性相同才能复制* @param source* @param target* @param <O>* @param <T>* @return*/public static <O, T> T mapperObject(O source, T target) {String baseKey = generateKey(source.getClass(), target.getClass());BeanCopier copier;if (!mapCaches.containsKey(baseKey)) {copier = BeanCopier.create(source.getClass(), target.getClass(), false);mapCaches.put(baseKey, copier);} else {copier = mapCaches.get(baseKey);}copier.copy(source, target, null);return target;}public static <O, T> T mapperObject(O source, T target, Consumer<T> action) {mapperObject(source, target);action.accept(target);return target;}public static <O, T> T mapperObject(O source, T target, UnaryOperator<T> action) {mapperObject(source, target);return action.apply(target);}private static <O, T> T baseMapper(O source, Class<T> target) {String baseKey = generateKey(source.getClass(), target);BeanCopier copier;if (!mapCaches.containsKey(baseKey)) {copier = BeanCopier.create(source.getClass(), target, false);mapCaches.put(baseKey, copier);} else {copier = mapCaches.get(baseKey);}T instance = null;try {//需要复制的对象必须要有无参构造器instance = target.getDeclaredConstructor().newInstance();} catch (Exception e) {e.printStackTrace();}copier.copy(source, instance, null);return instance;}private static String generateKey(Class<?> class1, Class<?> class2) {return class1.toString() + class2.toString();}}

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;public class CGlibMapperTest {public static UserBean createUser(){UserBean user = new UserBean();NameBean nameObj = new NameBean();user.setName(nameObj);DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");user.setPhone("18576670069");user.setSex("1");user.setAge(10);try {user.setBirthdate(dateFormat.parse("1990-10-11"));} catch (ParseException e) {e.printStackTrace();}user.setMoney(99999l);user.setCreateTime(new Date());user.setCreateUser("张三");user.setModifyTime(new Date());user.setModifyUser("李四");user.setIsValidate("1");user.setComments("2020年疫情大爆发");try {nameObj.setCreateTime(dateFormat.parse("2020-03-06"));} catch (ParseException e) {e.printStackTrace();}nameObj.setCreateUser("王五");nameObj.setModifyTime(new Date());nameObj.setModifyUser("赵六");nameObj.setIsValidate("1");nameObj.setComments("2020年疫情大爆发");return user;}public static void main(String[] args) {UserBean user = CGlibMapperTest.createUser();UserBean user2 = CGlibMapper.mapper(user,user.getClass());System.out.println("1___"+user2);UserBean user3 = CGlibMapper.mapper(user,user.getClass(),userBean -> {userBean.getName().setFirstName("川_");userBean.getName().setLastName("建国");System.out.println("2___"+userBean);return userBean;});CGlibMapper.mapper(user,StudentBean.class,studentBean -> {studentBean.setName("张同学");System.out.println("3___"+studentBean);});StudentBean studentBean1 = CGlibMapper.mapperObject(user,new StudentBean(),studentBean -> {System.out.println(studentBean);});StudentBean studentBean2 = CGlibMapper.mapperObject(user,new StudentBean(),studentBean -> {studentBean.setAddr("滨江一号");studentBean.setName("美国骗子");studentBean.setNameBean(CGlibMapper.mapper(user.getName(),NameBean.class));System.out.println(studentBean);return studentBean;});}
}

控制台输出看结果

"C:\Program Files\Java\jdk-10\bin\java.exe" "-javaagent:D:\Program Files\JetBrains\idel2019\lib\idea_rt.jar=59569:D:\Program Files\JetBrains\idel2019\bin" -Dfile.encoding=UTF-8 -classpath D:\workplace\liwei\javaAction2\ModernJavaInAction-master\target\classes;C:\Users\Thinkpad\.m2\repository\org\openjdk\jmh\jmh-core\1.21\jmh-core-1.21.jar;C:\Users\Thinkpad\.m2\repository\net\sf\jopt-simple\jopt-simple\4.6\jopt-simple-4.6.jar;C:\Users\Thinkpad\.m2\repository\org\apache\commons\commons-math3\3.2\commons-math3-3.2.jar;C:\Users\Thinkpad\.m2\repository\org\openjdk\jmh\jmh-generator-annprocess\1.21\jmh-generator-annprocess-1.21.jar;C:\Users\Thinkpad\.m2\repository\io\reactivex\rxjava2\rxjava\2.2.2\rxjava-2.2.2.jar;C:\Users\Thinkpad\.m2\repository\org\reactivestreams\reactive-streams\1.0.2\reactive-streams-1.0.2.jar;C:\Users\Thinkpad\.m2\repository\com\typesafe\akka\akka-actor_2.12\2.5.16\akka-actor_2.12-2.5.16.jar;C:\Users\Thinkpad\.m2\repository\org\scala-lang\scala-library\2.12.6\scala-library-2.12.6.jar;C:\Users\Thinkpad\.m2\repository\com\typesafe\config\1.3.3\config-1.3.3.jar;C:\Users\Thinkpad\.m2\repository\org\scala-lang\modules\scala-java8-compat_2.12\0.8.0\scala-java8-compat_2.12-0.8.0.jar;C:\Users\Thinkpad\.m2\repository\com\typesafe\akka\akka-stream_2.12\2.5.16\akka-stream_2.12-2.5.16.jar;C:\Users\Thinkpad\.m2\repository\com\typesafe\akka\akka-protobuf_2.12\2.5.16\akka-protobuf_2.12-2.5.16.jar;C:\Users\Thinkpad\.m2\repository\com\typesafe\ssl-config-core_2.12\0.2.4\ssl-config-core_2.12-0.2.4.jar;C:\Users\Thinkpad\.m2\repository\org\scala-lang\modules\scala-parser-combinators_2.12\1.1.1\scala-parser-combinators_2.12-1.1.1.jar;C:\Users\Thinkpad\.m2\repository\junit\junit\4.12\junit-4.12.jar;C:\Users\Thinkpad\.m2\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;C:\Users\Thinkpad\.m2\repository\org\projectlombok\lombok\1.18.12\lombok-1.18.12.jar;C:\Users\Thinkpad\.m2\repository\com\esotericsoftware\kryo\5.0.0-RC6\kryo-5.0.0-RC6.jar;C:\Users\Thinkpad\.m2\repository\com\esotericsoftware\reflectasm\1.11.8\reflectasm-1.11.8.jar;C:\Users\Thinkpad\.m2\repository\org\objenesis\objenesis\3.0.1\objenesis-3.0.1.jar;C:\Users\Thinkpad\.m2\repository\com\esotericsoftware\minlog\1.3.1\minlog-1.3.1.jar;C:\Users\Thinkpad\.m2\repository\net\sf\json-lib\json-lib\2.4\json-lib-2.4-jdk15.jar;C:\Users\Thinkpad\.m2\repository\commons-beanutils\commons-beanutils\1.8.0\commons-beanutils-1.8.0.jar;C:\Users\Thinkpad\.m2\repository\commons-collections\commons-collections\3.2.1\commons-collections-3.2.1.jar;C:\Users\Thinkpad\.m2\repository\commons-lang\commons-lang\2.5\commons-lang-2.5.jar;C:\Users\Thinkpad\.m2\repository\commons-logging\commons-logging\1.1.1\commons-logging-1.1.1.jar;C:\Users\Thinkpad\.m2\repository\net\sf\ezmorph\ezmorph\1.0.6\ezmorph-1.0.6.jar;C:\Users\Thinkpad\.m2\repository\asm\asm\3.3.1\asm-3.3.1.jar;C:\Users\Thinkpad\.m2\repository\asm\asm-commons\3.3.1\asm-commons-3.3.1.jar;C:\Users\Thinkpad\.m2\repository\asm\asm-tree\3.3.1\asm-tree-3.3.1.jar;C:\Users\Thinkpad\.m2\repository\org\springframework\spring-context\4.0.7.RELEASE\spring-context-4.0.7.RELEASE.jar;C:\Users\Thinkpad\.m2\repository\org\springframework\spring-aop\4.0.7.RELEASE\spring-aop-4.0.7.RELEASE.jar;C:\Users\Thinkpad\.m2\repository\aopalliance\aopalliance\1.0\aopalliance-1.0.jar;C:\Users\Thinkpad\.m2\repository\org\springframework\spring-beans\4.0.7.RELEASE\spring-beans-4.0.7.RELEASE.jar;C:\Users\Thinkpad\.m2\repository\org\springframework\spring-expression\4.0.7.RELEASE\spring-expression-4.0.7.RELEASE.jar;C:\Users\Thinkpad\.m2\repository\org\springframework\spring-core\4.0.7.RELEASE\spring-core-4.0.7.RELEASE.jar com.gufu.liwei.j2se.object.cloneobj.CGlibMapperTest
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.springframework.cglib.core.ReflectUtils$2 (file:/C:/Users/Thinkpad/.m2/repository/org/springframework/spring-core/4.0.7.RELEASE/spring-core-4.0.7.RELEASE.jar) to method java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain)
WARNING: Please consider reporting this to the maintainers of org.springframework.cglib.core.ReflectUtils$2
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
1___UserBean(name=NameBean(firstName=null, lastName=null, createTime=Fri Mar 06 00:00:00 CST 2020, createUser=王五, modifyTime=Tue Jun 02 16:03:19 CST 2020, modifyUser=赵六, isValidate=1, comments=2020年疫情大爆发), phone=18576670069, sex=1, age=10, birthdate=Thu Oct 11 00:00:00 CST 1990, money=99999, createTime=Tue Jun 02 16:03:19 CST 2020, createUser=张三, modifyTime=Tue Jun 02 16:03:19 CST 2020, modifyUser=李四, isValidate=1, comments=2020年疫情大爆发)
2___UserBean(name=NameBean(firstName=川_, lastName=建国, createTime=Fri Mar 06 00:00:00 CST 2020, createUser=王五, modifyTime=Tue Jun 02 16:03:19 CST 2020, modifyUser=赵六, isValidate=1, comments=2020年疫情大爆发), phone=18576670069, sex=1, age=10, birthdate=Thu Oct 11 00:00:00 CST 1990, money=99999, createTime=Tue Jun 02 16:03:19 CST 2020, createUser=张三, modifyTime=Tue Jun 02 16:03:19 CST 2020, modifyUser=李四, isValidate=1, comments=2020年疫情大爆发)
3___StudentBean(listTitle=[Spring, Java], name=张同学, addr=null, sex=1, age=10, birthdate=Thu Oct 11 00:00:00 CST 1990, createTime=Tue Jun 02 16:03:19 CST 2020, createUser=张三, modifyTime=Tue Jun 02 16:03:19 CST 2020, modifyUser=李四, isValidate=1, comments=2020年疫情大爆发, nameBean=null)
StudentBean(listTitle=[Spring, Java], name=null, addr=null, sex=1, age=10, birthdate=Thu Oct 11 00:00:00 CST 1990, createTime=Tue Jun 02 16:03:19 CST 2020, createUser=张三, modifyTime=Tue Jun 02 16:03:19 CST 2020, modifyUser=李四, isValidate=1, comments=2020年疫情大爆发, nameBean=null)
StudentBean(listTitle=[Spring, Java], name=美国骗子, addr=滨江一号, sex=1, age=10, birthdate=Thu Oct 11 00:00:00 CST 1990, createTime=Tue Jun 02 16:03:19 CST 2020, createUser=张三, modifyTime=Tue Jun 02 16:03:19 CST 2020, modifyUser=李四, isValidate=1, comments=2020年疫情大爆发, nameBean=NameBean(firstName=川_, lastName=建国, createTime=Fri Mar 06 00:00:00 CST 2020, createUser=王五, modifyTime=Tue Jun 02 16:03:19 CST 2020, modifyUser=赵六, isValidate=1, comments=2020年疫情大爆发))Process finished with exit code 0

使用BeanCopier复制对象相关推荐

  1. BeanCopier 复制对象

    BeanCopier.copy(参数1,参数2,null) 把参数1的属性复制到参数2中,默认只复制相同的属性名且相同类型: 第三个参数useConverter,是否开启Convert.默认BeanC ...

  2. JS如何深度复制对象和数组,避免指针变量引用修改值

    //自定义深度复制对象or数组的递归方法---------------------------------------- let copyObjOrArr = o => {let isArray ...

  3. java 复制对象有哪些方式

    2019独角兽企业重金招聘Python工程师标准>>> java 复制对象有哪些方式 Apache的 Common beanutils库 org.apache.commons.bea ...

  4. JavaScript 复制对象与Object.assign方法无法实现深复制

    在JavaScript这门语言中,数据类型分为两大类:基本数据类型和复杂数据类型.基本数据类型包括Number.Boolean.String.Null.String.Symbol(ES6 新增),而复 ...

  5. UNITY 复制对象后局部坐标和世界坐标的变化问题

    UNITY 复制对象后局部坐标和世界坐标的变化问题 void Start () { var pgo = transform.Find ("Button").gameObject; ...

  6. JS:js中的复制对象值问题——Object.assign()

    在复制对象的值的时候,往往不能直接"=",这样会造成引用赋值,应该利用一些函数进行对象的复制值.如下: $scope.updateDeliveryOrder = function( ...

  7. C# 快速高效率复制对象另一种方式 表达式树

    1.需求 在代码中经常会遇到需要把对象复制一遍,或者把属性名相同的值复制一遍. 比如: public class Student{public int Id { get; set; }public s ...

  8. assign复制对象_JavaScript标准对象:assign,values,hasOwnProperty和getOwnPropertyNames方法介绍...

    assign复制对象 In JavaScript, the Object data type is used to store key value pairs, and like the Array ...

  9. [转载] Java复制对象与集合工具类

    参考链接: Java中的类和对象 项目中经常需要将某个对象的属性值复制给另一个对象,或者将一个集合复制到另一个集合.利用spring提供的BeanUtils,自己简单封装了一个工具类. public ...

最新文章

  1. 海南大学植物保护学院刘铜教授课题组招聘简介
  2. input取消焦点 vue_Vue有什么特性,相对于其他框架都有那些优势!
  3. 企业安全建设之搭建开源SIEM平台(上)
  4. 高级工程师必须精通的七种武器(摘录)
  5. 我的JMX心得 -- Server端
  6. Poj 2503 Babelfish(Map操作)
  7. 《软件需求分析(第二版)》第 10 章——编写需求文档 重点部分总结
  8. C# 输出目录结构树到Console或文本文件
  9. phpExcel与jq的ajax
  10. java连接Oracle数据库
  11. 帆软报表插件开发之fine-decision中的AccessProvider扩展
  12. Xcode可删除文件列表
  13. 以CCF CSP认证为抓手,积极探索软件基础能力递进式培养体系
  14. jmeter进行http压力测试
  15. OSX 安装配置Maven
  16. Deconstructing laws of accessibility and facility distribution in cities
  17. 解决笔记本HDMI外接显示器没声音的问题
  18. Linux下Linpack测试GPU和CPU性能
  19. matlab中插入希腊,matlab中希腊字母打法
  20. 计算机录屏幕和声音的软件是什么,怎么样录制电脑的屏幕和声音?可以进行电脑录像的软件|录制电脑屏幕的方法...

热门文章

  1. HTML基础教程 表格
  2. iOS静态库简单使用与开发
  3. 大数据思维——从掷骰子到纸牌屋 的书评
  4. python公众号文章阅读量_史上最快、最笨的公众号文章阅读数、在看数采集,哈哈...
  5. 伽玛函数_gamma
  6. 泊松积分、伽马函数——公式干货总结
  7. java 获取cookies
  8. php入门之奇偶数判断
  9. 【Nginx 日志配置】【访问日志log_format】【错误日志error_log 指令】【Nginx的日志轮转】
  10. 跨碧岭观赏龙潭瀑布群