在Java中常见的对象拷贝方式是使用cglib,Cglib的性能是目前公认最好的,用于解决Bean拷贝的性能问题

下面是以cglib封装的工具类实现对象和集合的拷贝

一、引入依赖

<dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>3.3.0</version><scope>compile</scope>
</dependency>

二、创建CglibUtil工具类

其中包含对象和集合的拷贝,还封装了Bean转Map的方法

import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.ReflectUtil;
import net.sf.cglib.beans.BeanCopier;
import net.sf.cglib.beans.BeanMap;
import net.sf.cglib.core.Converter;import java.util.Collection;
import java.util.List;
import java.util.function.BiConsumer;
import java.util.function.Supplier;
import java.util.stream.Collectors;
/*** @author YangBoss* @title: CglibUtil* @projectName frontop-ao* @description: CglibUtil工具类* @date 2022/6/2 10:18*/
public class CglibUtil {/*** 拷贝Bean对象属性到目标类型<br>* 此方法通过指定目标类型自动创建之,然后拷贝属性** @param <T>         目标对象类型* @param source      源bean对象* @param targetClass 目标bean类,自动实例化此对象* @return 目标对象*/public static <T> T copy(Object source, Class<T> targetClass) {return copy(source, targetClass, null);}/*** 拷贝Bean对象属性<br>* 此方法通过指定目标类型自动创建之,然后拷贝属性** @param <T>         目标对象类型* @param source      源bean对象* @param targetClass 目标bean类,自动实例化此对象* @param converter   转换器,无需可传{@code null}* @return 目标对象*/public static <T> T copy(Object source, Class<T> targetClass, Converter converter) {final T target = ReflectUtil.newInstanceIfPossible(targetClass);copy(source, target, converter);return target;}/*** 拷贝Bean对象属性** @param source 源bean对象* @param target 目标bean对象*/public static void copy(Object source, Object target) {copy(source, target, null);}/*** 拷贝Bean对象属性** @param source    源bean对象* @param target    目标beBeanCopierCachean对象* @param converter 转换器,无需可传{@code null}*/public static void copy(Object source, Object target, Converter converter) {Assert.notNull(source, "Source bean must be not null.");Assert.notNull(target, "Target bean must be not null.");final Class<?> sourceClass = source.getClass();final Class<?> targetClass = target.getClass();boolean conIsNull = converter == null ? false : true;final BeanCopier beanCopier = BeanCopier.create(sourceClass, targetClass, conIsNull);beanCopier.copy(source, target, converter);}/*** 拷贝List Bean对象属性** @param <S>    源bean类型* @param <T>    目标bean类型* @param source 源bean对象list* @param target 目标bean对象* @return 目标bean对象list*/public static <S, T> List<T> copyList(Collection<S> source, Supplier<T> target) {return copyList(source, target, null, null);}/*** 拷贝List Bean对象属性** @param source    源bean对象list* @param target    目标bean对象* @param converter 转换器,无需可传{@code null}* @param <S>       源bean类型* @param <T>       目标bean类型* @return 目标bean对象list* @since 5.4.1*/public static <S, T> List<T> copyList(Collection<S> source, Supplier<T> target, Converter converter) {return copyList(source, target, converter, null);}/*** 拷贝List Bean对象属性** @param source   源bean对象list* @param target   目标bean对象* @param callback 回调对象* @param <S>      源bean类型* @param <T>      目标bean类型* @return 目标bean对象list* @since 5.4.1*/public static <S, T> List<T> copyList(Collection<S> source, Supplier<T> target, BiConsumer<S, T> callback) {return copyList(source, target, null, callback);}/*** 拷贝List Bean对象属性** @param source    源bean对象list* @param target    目标bean对象* @param converter 转换器,无需可传{@code null}* @param callback  回调对象* @param <S>       源bean类型* @param <T>       目标bean类型* @return 目标bean对象list*/public static <S, T> List<T> copyList(Collection<S> source, Supplier<T> target, Converter converter, BiConsumer<S, T> callback) {return source.stream().map(s -> {T t = target.get();copy(s, t, converter);if (callback != null) {callback.accept(s, t);}return t;}).collect(Collectors.toList());}/*** 将Bean转换为Map** @param bean Bean对象* @return {@link BeanMap}* @since 5.4.1*/public static BeanMap toMap(Object bean) {return BeanMap.create(bean);}
}

三、测试拷贝对象和集合

拷贝对象测试,再将拷贝的对象和源对象放入集合中对拷贝集合测试

 public static void main(String[] args) {/*** 拷贝对象*///创建对象TUser tUser  = new TUser();tUser.setName("李四");//拷贝对象TUser tUser2 = CglibUtil.copy(tUser,TUser.class);//打印结果System.out.println(tUser2.getName());/*** 拷贝集合*///创建集合List<TUser> list1 = new ArrayList<>();list1.add(tUser);list1.add(tUser2);//拷贝集合List<TUser> list2 = CglibUtil.copyList(list1,TUser::new);//打印结果System.out.println(JSONObject.toJSONString(list2));}

结果打印

四、注意点

CglibUtil.copy拷贝对象的时候,目标对象被lombok注解@Accessors(chain = true)修饰报空指针

在拷贝对象上不可用注解 @Accessors ,反射获取不到对应的setter,因为这个链式生成的代码带了返回值,此注解会将set方法返回值改变

java如何拷贝复制对象和集合相关推荐

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

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

  2. java list 转json对象_JSON--List集合转换成JSON对象

    1. 简单的手动放置 键值对 到JSONObject,然后在put到JSONArray对象里 List al =articleMng.find(f); System.out.println(al.si ...

  3. java不同对象的集合拷贝_集合java对象

    JAVA基础教程汇总 到这一篇博客为止,JAVA的基础部分已经介绍完了,这一篇为基础部分的汇总. JAVA介绍 JAVA概述 Java的特点 JDK/bin目录下的不同exe文件的用途 JAVA环境变 ...

  4. Java提升篇:对象克隆(复制)

    引论 假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(boolean,char,byte,sho ...

  5. java 对象复制 反射_利用Java反射机制实现对象相同字段的复制操作

    一.如何实现不同类型对象之间的复制问题? 1.为什么会有这个问题? 近来在进行一个项目开发的时候,为了隐藏后端数据库表结构.同时也为了配合给前端一个更友好的API接口文档(swagger API文档) ...

  6. java复制对象_JAVA对象复制的方法

    1.概述 在实际编程过程中,我们常常要遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能 会需要一个和A完全相同新对象B,并且此后对B任何改动都不会影响到A中的值,也就是说,A与 ...

  7. java 复制对象_Java核心知识 基础七 JAVA 复制

    将一个对象的引用复制给另外一个对象,一共有三种方式.第一种方式是直接赋值,第二种方式 是浅拷贝,第三种是深拷贝.所以大家知道了哈,这三种概念实际上都是为了拷贝对象. 1. 直接赋值复制 直接赋值.在 ...

  8. Javascript中的对象拷贝(对象复制/克隆)

    Javascript中的对象拷贝(对象复制/克隆) 李俊才 CSDN:jcLee95 邮箱:291148484@163.com 1. 对象的引用 要说"拷贝"还要先说"引 ...

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

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

最新文章

  1. go移植linux内核书名叫啥,Go语言移植Linux内核数据结构hlist
  2. nagios自写插件—check_file
  3. 年度盛宴——2012年最精彩的15个 CSS3 教程
  4. 接口文档示例_在示例中使用Android中的Work Manager
  5. 安装解压版本的MySQL,安装过程中的常见命令,检查windows系统错误日志的方式来检查MySQL启动错误,关于Fatal error: Can't open and lock privilege
  6. 小程序 生成条形码barcode.js
  7. 深度学习可以与大数据分手吗?
  8. mkdir: Permission denied: user=root, access=WRITE
  9. solid测序列原理_SOLID原理简介
  10. Bzoj4199:[NOI2015]品酒大会
  11. 使用HTML Help Workshop将HTML转为CHM
  12. 苹果cms V10模板|首涂第二十五套精简宽屏主题模板破解带后台无加密版
  13. 杨辉三角 java版
  14. 如何设计高扩展的在线网页制作平台
  15. 论结果与过程的重要性
  16. RASNet视频目标跟踪论文笔记
  17. 删除桌面上出现无文件名图标的方法
  18. 官场直升机 鸿蒙笔著,担当:老衲笔尖无墨水,要从空处想鸿蒙
  19. 中国大学MOOC-陈越、何钦铭-数据结构-2020春期中考试
  20. 【List、Set、数据结构、Collections】

热门文章

  1. 史上最详细:YOLO v3算法的具体流程和实现细节
  2. c语言中应用程序错误,应用程序错误0xc0000022 浅析win10应用程序错误0xc0000022的应对办法...
  3. 交换机中光口是如何配置的
  4. 用html写一个QQ空间登录页面
  5. 微信小程序之绑定银行卡功能实现
  6. 【独家】华为OD机试 - 基站维修工程师(C 语言解题)
  7. iOS 7完美越狱发布 中国版存“猫腻”
  8. 我的世界云之海服务器无尽试炼绿洲,喵界异闻录测试服-圣灵之境游戏-搜视网...
  9. excel文件外链多了打开慢怎么办
  10. 解决building workplace 导致的卡死,使得eclipse加速