java深度克隆工具类——支持对象和对象集合

2023-11-01

正经学徒,佛系记录,不搞事情

第一步:创建工具类

直接使用commons-beanutils实现对象拷贝,引入pom

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

创建工具类:BeanUtils

public class BeanUtils {
    /**
     * @param orig  源对象
     * @param dest  目标对象
     */
    public static void copyProperties(final Object orig,final Object dest){
        try{
            org.apache.commons.beanutils.BeanUtils.copyProperties(dest, orig);
        }catch (Exception e){
            throw new RuntimeException(e.getMessage());
        }
    }

    /**
     * @Description:拷贝list元素对象,将origs中的元素信息,拷贝覆盖至dests中
     * @param origs 源list对象
     * @param dests 目标list对象
     * @param origsElementTpe 源list元素类型对象
     * @param destElementTpe 目标list元素类型对象
     * @param <T1> 源list元素类型
     * @param <T2> 目标list元素类型
     */
    public static <T1,T2> void copyProperties(final List<T1> origs, final List<T2> dests, Class<T1> origsElementTpe, Class<T2> destElementTpe){
        if(origs==null||dests==null){
            return ;
        }
        if(dests.size()!=0){
            //防止目标对象被覆盖,要求必须长度为零
            throw new RuntimeException("目标对象存在值");
        }
        try{
            for (T1 orig: origs) {
                T2 t = destElementTpe.newInstance();
                dests.add(t);
                copyProperties(orig,t);
            }
        }catch (Exception e){
            throw new RuntimeException(e.getMessage());
        }
    }
}

注:抛出异常部分可根据实际项目需要,抛出自定义异常。

第二步:测试

创建两个实体类,实体类只相差一个属性,用于测试

BeanOne.java

private String id;
private String name;
private String beanOne;

BeanTwo.java

private String id;
private String name;
private String beanTwo;
  •  测试直接拷贝对象:
BeanOne orig = new BeanOne("123","张三","one");
//直接赋值
BeanOne dest = orig;
//修改值
dest.setId("456");
dest.setName("李四");
System.out.println("赋值后的原始值:"+orig.toString());
System.out.println("赋值后新对象值:"+dest.toString());

结果:直接拷贝对象时,是地址拷贝,orig与dest指向同一个地址,导致修改dest会影响到orig

  • 测试深度克隆拷贝相同类型对象:
BeanOne orig = new BeanOne("123","张三","one");
//深度克隆
BeanOne dest = new BeanOne();
BeanUtils.copyProperties(orig,dest);
dest.setId("456");
dest.setName("李四");
System.out.println("赋值后的原始值:"+orig.toString());
System.out.println("赋值后新对象值:"+dest.toString());

结果:修改dest不会影响到orig的值

  • 测试深度克隆拷贝不相同类型对象:
BeanOne orig = new BeanOne("123","张三","one");
//深度克隆
BeanTwo dest = new BeanTwo();
BeanUtils.copyProperties(orig,dest);
dest.setName("李四");
System.out.println("赋值后的原始值:"+orig.toString());
System.out.println("赋值后新对象值:"+dest.toString());

结果:不同类型的对象之间的拷贝,则相同属性会拷贝,不同属性不会拷贝

注:追溯org.apache.commons.beanutils.BeanUtils源码,克制对象之间的拷贝是通过属性名的而与类型无关,未避免异常,两个不同类型的对象之间的拷贝,尽可能保证相同属性名的类型也保持一致。

  • 测试深度克隆拷贝集合对象:
List<BeanOne> origs = new ArrayList<>();
origs.add(new BeanOne("123","张三","one"));
origs.add(new BeanOne("456","李四","one1"));
//深度克隆
List<BeanTwo> dests = new ArrayList<>();
BeanUtils.copyProperties(origs,dests,BeanOne.class,BeanTwo.class);
for(BeanTwo temp : dests){
    temp.setName("都是two");
}
System.out.println("赋值后的原始值:"+origs.toString());
System.out.println("赋值后新对象值:"+dests.toString());

结果:拷贝成功,且不影响原始值

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java深度克隆工具类——支持对象和对象集合 的相关文章

  • Spring boot 2.0.5.RELEASE和mongo 4.0连接问题

    我正在关注使用 MongoDB 访问数据教程春季网站 https spring io guides gs accessing data mongodb 我将 Mongo DB 服务器版本 4 安装为服务当我使用客户端连接到它时 它的身份验证
  • Glassfish:在部署期间修改 EAR 的部署描述符

    经过几天的搜索 尝试和摇头 我将这个问题发布到 SO 尽管它seems已经得到答复 这是场景 我有一个 EAR 应用程序 目前 包含一个 WAR 和一个 EJB 模块 EJB 模块使用 JPA persistence xml 并且一些无状态
  • EL 通过 Scriptlet

    在 JSP 中使用 EL 相对于 scriptlet 的优势是什么 EL 被认为是无脚本语言 EL 使 JSP 免受容易出错原始 Java 代码并强制您根据 MVC 思想编写 JSP EL 或像 JSTL 这样的标签库 不可能实现的任何事情
  • 使用 Hibernate Dialect 设置表字符集/排序规则?

    我使用 Hibernate MySQLInnoDB Dialect 来生成 DDL hibernate cfg xml
  • Android 游戏偶尔出现延迟

    我正在用 Java 制作一个简单的 Android 游戏 我注意到每 20 40 秒就会出现一些烦人的延迟 首先 我认为它们是由垃圾收集器引起的 但当我检查 LogCat 时 我发现游戏滞后时没有垃圾收集 每当游戏开始滞后时 我都会标记日志
  • c和java语言中的换行符

    现在行分隔符取决于系统 但在 C 程序中我使用 n 作为行分隔符 无论我在 Windows 还是 Linux 中运行它都可以正常工作 为什么 在java中 我们必须使用 n 因为它与系统相关 那么为什么我们在c中使用 n 作为新行 而不管我
  • 我需要一个字数统计程序[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我需要弄清
  • 在java中将DataURL图像转换为图像文件

    我在我的 java servlet 中接收图像 DataURL 它看起来像 data image jpeg base64 9j 4AAQSkZJRgABAQAAAQABAA 我需要将其另存为图像文件 我该怎么做 The simplest w
  • 为什么下面代码的输出是Thread[main,5,main]

    public class test1 public static void main String args TODO Auto generated method stub Thread t Thread currentThread Sys
  • 使用 Box2d(适用于 Android)进行碰撞检测?

    有人可以解释一下使用 box2d for android 进行碰撞检测的工作原理吗 我无法理解 BBContactListener 以什么方式工作 BBContactListener listener new BBContactListen
  • JFrame Glasspane 也优于 JDialog,但不应该

    我有一个带有 Glasspane 的 JFrame 未装饰 该框架打开一个 JDialog 也未装饰 也有一个 glassPane 并隐藏自身 setVisible false Glasspanes 通过 setGlassPane 设置 对
  • Java字符串查找和替换的最佳方法?

    我正在寻找 Java 中字符串查找和替换的最佳方法 这是一句话 我的名字叫米兰 人们都知道我叫米兰瓦西奇 我想用 Milan Vasic 替换 Milan 弦 但在我已经有 Milan Vasic 的地方 情况不应该是这样 搜索 替换后的结
  • Java LRU 缓存使用 LinkedList

    堆栈溢出的新手 所以请不要介意我以菜鸟的方式问这个问题 我正在尝试使用链表实现 LRU 缓存 我在这里看到了使用 linkedHashMap 和其他数据结构的其他实现 但对于这种情况 我正在尝试使用链表创建最佳优化版本 正如我在技术期间被问
  • SimpleDateFormat 无法解析的日期 如果语言环境为 ES,则会出现错误。推特“创建时间”

    我正在尝试将 Twitter created at 转换为阿根廷日期时间 如果我这样做 final String TWITTER EEE MMM dd HH mm ss SimpleDateFormat sf new SimpleDateF
  • Java 验证日期为 yyyyMMddHHmmss

    我想在java中验证给定的日期格式为yyyyMMddHHmmss 状况 应符合格式 yyyyMMddHHmmss 它应该验证当前日期 它应该验证与当前小时有 3 小时或 3 小时差异的小时数 如果满足所有三个条件 Java 方法应返回 tr
  • 更新分页。是否可以?

    他们是否存在一些方法来处理更新分页 例如我有 100 行类型 Id private Integer id Column private boolean flag Column private Date last 一开始它们看起来像 id f
  • Struts2中的变量声明

    Struts2中如何声明变量并为该变量赋值 使用设置标签
  • Lucene/Hibernate 搜索锁定异常

    我使用 Hibernate Search 在 Web 应用程序上索引和全文搜索项目 没有问题 来自我的 pom xml
  • 构造函数参数和属性一起出现在 bean 定义中

  • AndroidAnnotations 和 Dagger

    我正在尝试使用 Dagger 注入 Android 带注释的 Activity java lang IllegalArgumentException No inject registered for members com app serv

随机推荐

  • 悄悄分享 60 个相见恨晚的神器工具

    让 WebP 图片下载为 PNG 格式 从 Github 批量下载表情包 一键滚动截屏整个网页 助你快速成为 B 站老司机 一键分析网站技术栈 翻录网页视频神器等等 这些功能 都能在 Chrome 中使用件简单实现 不信 你往下看就行了 最
  • Spring Boot集成Swagger3.0,Knife4j导出文档

    文章目录 Spring Boot集成Swagger3 0 Knife4j导出文档 效果展示 如何使用 简要说明 添加依赖 添加配置类 测试接口 token配置位置 问题1 多文件上传 方法一 配置全局参数 方法二 开启动态参数 自定义多个文
  • Callable日常使用

    Callable日常使用 前言 之前在项目中有个多线程校验导入数据的额需求 就想到了callable 既有返回值又可以抛出异常 岂不美哉 工作之余总结下callable的使用 方便后期CV 目录 Callable日常使用 一 自定义call
  • 360安全卫士添加信任区

    系列文章目录 文章目录 系列文章目录 前言 一 添加信任区 二 步骤 1 木马查杀 2 信任区 3 添加信任的文件 总结 前言 360安全卫士经常会误报 虽然有想过卸载360 但他的有些小工具还挺实用 哎 鸡肋啊 一 添加信任区 打开360
  • 上一个说软件测试简单的,已经被面试官问emo了···

    现在已经过了 不会但我会学 就能感动面试官的时代 随着供需关系的变化 不论是对于面试官还是面试者 面试的成本越来越高 为了筛选到更优秀的程序员 面试官们可谓是绞尽了脑汁 面试造火箭 工作拧螺丝 的传言也不是空穴来风 那些面试官最喜欢的就是你
  • oracle碎片小结

    author skate time 2010 05 31 我们在使用windows的时候 都知道要定期整理磁盘碎片 因为磁盘碎片会影响性能 给管理上带来额外的负担 那oracle更是如此 当随着数据增加 oracle处理海量数据本身就已经很
  • 2021-11-08

    https learnku com docs the way to go 104 tag structure 3642 https mp weixin qq com s 3sjlDFSthVK3 E54TqqUqw
  • faster-rcnn(pytorch)参数配置修改

    修改模型配置文件 train prototxt文件 input data层的num class数值由21改为类别数目 roi data层的num class数值由21改为类别数目 cls score层的num output数值由21改为类别
  • 通过Python2.7访问Oracle

    环境 Python 2 7 cx Oracle 7 3 0 instantclient basic linux x64 version zip unzip instantclient basic zip unzip d cx Oracle
  • 6.Docker Desktop 安装使用教程

    本文目录 1 前言 2 下载 Docker Desktop 3 安装 Docker Desktop 1 配置 Docker Desktop 环境 2 安装 wsl2 2 下载并安装 3 打开 Docker Desktop 的问题 1 问题一
  • 【高级CSS属性】那些年轰动一时的5个CSS高级属性(附源码)

    文章目录 写在前面 涉及知识点 1 empty选择器 1 1 应用场景及效果 1 2 代码实现 2 gap属性 2 1 应用场景及效果 2 2 代码实现 3 伪类 invalid 应用 3 1 应用场景及效果 3 2 代码实现 4 back
  • Es java分页查询列表数据

    Autowired private RestHighLevelClient client public List
  • Android 计算View的深度

    这次遇到一个需求 需要计算当前View的深度 基本上就是大学时候数据结构里求二叉树的解法 记录一下 理论上也可以用于性能优化和性能监控 private int maxDeep View view view不会有子view所以就返回0 if
  • 4.2 线性方程组有解判断

    文章目录 系数矩阵 增广系数矩阵 方程组的矩阵与向量表示形式 结论 判断方程组有无解的步骤 求线性方程组的一般思路 例题 参考 系数矩阵 增广系数矩阵 方程组的矩阵与向量表示形式 求解方程组就是对增广矩阵做初等行变换将系数矩阵化为行简化阶梯
  • Python——算法

    文章目录 算法 1 世界末日 2 马虎的算式 3 振兴中华 4 斐波那契数列 5 武功秘籍 6 切面条 7 立方变自身 8 圆的面积 9 字母图形 10 Huffuman树 算法 1 世界末日 曾有邪教称1999年12月31日是世界末日 当
  • 游戏开发unity插件DoTween:实现人物向目标方向旋转

    已知世界坐标下目标对象的朝向向量B 当前人物朝向向量A transform forward 如何用DoTween实现人物旋转动画呢 Vector3 forwardWorldVector B float duration 0 5f trans
  • 产品研发流程

    需求管理流程介绍 1 1需求管理流程 产品研发的生命周期 一般需要以下几个环节 1 2常用的调研方法 1 3如何进行访谈 访谈注意事项 1 列调研大纲 根据大纲去调研 2 调研顺序 先流程后细节 1 流程从哪里开始 由谁发起 什么事情触发的
  • 想入手抖音定制生日祝福短视频,没有创意思路怎么办?几个方面带你了解整个流程

    项目 定制派大星生日祝福视频 原理 从抖音引流到微信转为私域流量 成本 一部手机 一个微信小号 需要的资源 配音声优 视频素材 一个抖音号 剪辑工具 剪映 这是一个淘宝商品改造成抖音的玩法项目 一 需求思路 儿童喜欢看的动画片人物 比如 派
  • ubuntu16.04开起wifi热点

    1 首先保证电脑连接有线网络 2 点击电脑屏幕右上方联网图标 选择最后一个选项 编辑连接 3 进入如下页面 选中选中wifi选项 点击添加 4 进入如下页面 选择连接类型为wifi 点击新建 5 进入如下页面 填写连接名称与SSID 这两项
  • java深度克隆工具类——支持对象和对象集合

    正经学徒 佛系记录 不搞事情 第一步 创建工具类 直接使用commons beanutils实现对象拷贝 引入pom