CopyUtil对象复制工具类

介绍

CopyUtil是一个通用的对象复制工具类,其中包含单体复制列表复制两个方法。

单体复制方法copy通过传入源对象和目标class,利用Java反射机制创建目标对象,并将源对象的属性值复制到目标对象中。若源对象为空,则返回null。若创建目标对象失败,则返回null。

列表复制方法copyList通过遍历源列表中的每个对象,调用单体复制方法copy完成每个对象的复制,将复制后的对象添加到新的列表中。若源列表为空,则返回空列表。

在这个实现中,使用了开源框架BeanUtils的copyProperties方法实现属性复制。同时,为了处理异常情况,使用了try-catch语句进行异常捕获,并记录错误信息到日志系统中。代码中还引入了@Slf4j注解,方便使用Lombok提供的日志功能,无需手动声明Logger对象。

该工具类可用于简化程序中的对象复制操作,避免了手动编写属性赋值代码的繁琐过程,提高了开发效率。

注意的是,在使用BeanUtils进行属性复制时,源对象和目标对象的属性名、类型等必须严格一致,否则会导致复制失败或出现异常。

源码

@Slf4j
public class CopyUtil {
    
    /**
     * 单体复制
     */
    public static <T> T copy(Object source, Class<T> clazz) {
        if (source == null) {
            return null;
        }
        T obj = null;
        try {
            obj = clazz.newInstance();
        } catch (Exception e) {
            log.error("CopyUtil error",e);
            return null;
        }
        BeanUtils.copyProperties(source, obj);
        return obj;
    }
    
    /**
     * 列表复制
     */
    public static <T> List<T> copyList(List<?> source, Class<T> clazz) {
        List<T> target = new ArrayList<>();
        if (!CollectionUtils.isEmpty(source)){
            for (Object c: source) {
                T obj = copy(c, clazz);
                target.add(obj);
            }
        }
        return target;
    }
}

分析

这段代码实现了一个通用的对象复制工具类 CopyUtil,提供了单体复制和列表复制两个方法,下面分别对两个方法的作用进行分析:

  • 单体复制方法 public static <T> T copy(Object source, Class<T> clazz):

该方法接收两个参数,源对象source和目标对象的Class类型clazz。它的作用是将源对象的属性值赋值给目标对象,并返回赋值后的目标对象。

具体实现过程如下:

  • 首先进行空指针判断,如果源对象为空直接返回 null。
  • 然后使用反射机制创建目标对象。
  • 最后利用 BeanUtils.copyProperties 方法将源对象的属性值复制到目标对象中。
  • 返回复制后的目标对象。

  • 列表复制方法 public static <T> List<T> copyList(List<?> source, Class<T> clazz):

该方法接收两个参数,源列表 source 和目标对象的 Class 类型 clazz。它的作用是将源列表中所有对象的属性值复制给各自对应的目标对象,并返回赋值后的目标对象列表。

具体实现过程如下:

  1. 首先创建一个目标对象列表 target,并用ArrayList实例化。
  2. 接着进行非空判断,如果源列表不为空,遍历源列表中的每个对象。
  3. 每次循环调用单体复制方法 copy(c, clazz) 复制当前对象,得到复制后的目标对象obj,并将obj添加到目标对象列表中。
  4. 最后返回复制后的目标对象列表。

用例

单体复制用例将 StudentDO 对象的属性通过 CopyUtil 对象复制工具类赋值给 StudnetVO 对象

StudentDO对象如下:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class StudentDO {
    /** 学号 */
    private Long id;
    /** 姓名 */
    private String name;
    /** 性别 */
    private Integer sex;
    /** 年龄 */
    private Integer age;
    /** 班级 */
    private String className;
    /** 专业 */
    private String speciality;
    /** 电话 */
    private String phone;
    /** 邮箱 */
    private String email;
}

StudentVO 对象如下:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class StudentVO {
    /** 学号 */
    private Long id;
    /** 姓名 */
    private String name;
    /** 性别 */
    private Integer sex;
    /** 年龄 */
    private Integer age;
}

可以看出 StudentVO 对象的属性名和 StudentDO 对象属性名一模一样,两者的差别仅在属性个数上。

将 StudentDO 对象的属性通过 CopyUtil 对象复制工具类赋值给 StudnetVO 对象,通过输出可以看到对象属性赋值成功。

@SpringBootTest
class CodeUseCasesApplicationTests {

    @Test
    void copyTest () {
        StudentDO studentDO = new StudentDO(Long.parseLong("202003021055"),"梁域强",1,21,"软件工程B班","软件工程","18475621348","542108996@qq.com");
        StudentVO studentVO = CopyUtil.copy(studentDO, StudentVO.class);

        System.out.println("studentDO = " + studentDO);
        System.out.println("studentVO = " + studentVO);
    }

}

输出结果:

列表复制用例:将 studentDOList 中的每一个属性通过 CopyUtil 对象复制工具类赋值给 studentDOList

@Test
    void listCopy() {
        StudentDO studentDO1 = new StudentDO(Long.parseLong("202003021057"),"张三",1,21,"软件工程B班","软件工程","18475621348","542108996@qq.com");
        StudentDO studentDO2 = new StudentDO(Long.parseLong("202003021023"),"李四",1,20,"计科A班","计算机科学与技术","15362919370","1378538974@qq.com");
        StudentDO studentDO3 = new StudentDO(Long.parseLong("202003021033"),"王五",0,24,"软件工程B班","软件工程","1382537649","6725368337@qq.com");

        List<StudentDO> studentDOList = Arrays.asList(studentDO1,studentDO2,studentDO3);
        List<StudentVO> studentVOList = CopyUtil.copyList(studentDOList, StudentVO.class);

        System.out.println("studentDOList = " + studentDOList);
        System.out.println("studentVOList = " + studentVOList);
    }

输出结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/427749.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何使用支付宝沙箱环境本地配置模拟支付并实现公网远程访问【内网穿透】

文章目录 前言1. 下载当面付demo2. 修改配置文件3. 打包成web服务4. 局域网测试5. 内网穿透6. 测试公网访问7. 配置二级子域名8. 测试使用固定二级子域名访问 前言 在沙箱环境调试支付SDK的时候&#xff0c;往往沙箱环境部署在本地&#xff0c;局限性大&#xff0c;在沙箱环境…

WordPress上传图片错误:不是合法的JSON响应

最近在进行WordPress迁移至新服务器的过程中&#xff0c;遭遇到一个棘手的问题&#xff0c;即在编辑文章并上传图片时&#xff0c;不断遭遇“此响应不是合法的JSON响应”的错误。经过多次验证和搜索&#xff0c;最终确定问题的根本原因并不在于禁用 Gutenberg 编辑器或安装经典…

maven配置文件(一)Settings配置

一、仓库 1、关系 我们依赖的外部服务是需要有地方进行存储的&#xff0c;而存储的地方就称之为仓库。其中仓库又分为本地仓库、中央仓库、镜像仓库、私服。 &#xff08;1&#xff09;本地仓库 当项目在本地编译或运行时&#xff0c;直接加载本地的依赖服务无疑是最快的。默…

微信如何设置自动回复消息,提升沟通效率的?

在日常微信聊天过程中&#xff0c;我们可能会频繁遇到相同问题的客户提问&#xff0c;特别是对于从事销售工作的朋友们而言&#xff0c;客户添加好友后的第一句话常常为“在吗”或“你好”。当我们拥有大量好友&#xff0c;手动逐一回复可能会耗费大量时间。因此&#xff0c;自…

甘特图资源视图和任务视图的区别

甘特图(Gantt chart)是一种常用的项目管理工具,用于直观地展示项目的进度和各项任务的时间安排。甘特图包含资源视图和任务视图两种视角。 一个项目的甘特图demo &#xff1a; https://zz-plan.com/share/87f1340286f1343ba5 资源视图主要显示项目中不同资源的分配和利用情况…

预处理大致解析(参见《C语言深度解剖》更好得到学习)

预处理大致解析&#xff08;参见《C语言深度解剖》更好得到学习&#xff09; 一、预定义符号二、#define三、其他预处理指令<font face "楷体" size 5 color blue>//库文件包含 //#include < filename.h > //直接在库文件所在的标志路径查找&#xff…

谷歌seo推广效果怎么判断?

要想判断谷歌SEO推广效果&#xff0c;核心在于观察和分析几个关键指标&#xff0c;一个网站最重要的自然就是流量&#xff0c;没有流量的网站说到底就是一个被雪藏的花架子&#xff0c;没什么意义&#xff0c;所以看流量自然就是最重要的指标&#xff0c;SEO做得好&#xff0c;…

阿里云服务器2核4G租用价格_2核4G支持人数新能测评

阿里云2核4G服务器多少钱一年&#xff1f;2核4G配置1个月多少钱&#xff1f;2核4G服务器30元3个月、轻量应用服务器2核4G4M带宽165元一年、企业用户2核4G5M带宽199元一年。可以在阿里云CLUB中心查看 aliyun.club 当前最新2核4G服务器精准报价、优惠券和活动信息。 阿里云官方2…

远程IT技术支持软件有哪些

什么是远程支持软件 远程支持软件允许 IT 部门和管理员通过内部网络或互联网从远程位置连接和控制设备&#xff0c;以解决技术问题并自动执行日常任务。企业使用远程支持软件来解决技术问题并增强安全性&#xff0c;而无需技术人员物理访问需要支持的设备。 远程支持解决方案…

PHP项目中composer和Git的组合使用

highlight: 在国内由于众所周知的原因&#xff0c;composer的package可能无法访问&#xff0c;解决办法是使用中国的全镜像&#xff1a; composer config -g repositories.packagist composer http://packagist.phpcomposer.com 在需要使用composer package的地方创建composer…

车载测试中:internal lock 的意思

internal lock的用法讲解 英语单词 \\"internal lock\\" 的用法讲解 \\"Internal lock\\" 是一个常见的词组&#xff0c;通常用于讨论机械、锁具和安全等方面的话题。下面将介绍这个词组的几种用法。 1. 机械锁中的 \\"internal lock\\" 在机…

YOLOv8 DeepSORT实现智能交通监控-改进yolo单目测距及速度测量-流量计数

YOLOv8 DeepSORT是一种基于目标检测和跟踪技术的智能交通监控系统。它基于YOLOv8&#xff0c;通过加入DeepSORT算法实现目标跟踪&#xff0c;同时还改进了YOLOv8的单目测距及速度测量技术和流量计数功能。 该系统可以通过摄像头或视频源实时捕获图像&#xff0c;并自动检测和跟…

python钉钉机器人加签

代码 import requests import json import time import hmac import hashlib import base64 import urllib.parsedef get_url(access_token, secret):t,s get_sign(secret)webhook_url fhttps://oapi.dingtalk.com/robot/send?access_token{access_token}&timestamp{t}…

TSMaster 2024 最新版本实用功能更新,收藏不迷路

TSMaster 作为一款软硬件解耦&#xff0c;快速迭代&#xff0c;并不断被软件定义的国产工业软件&#xff0c;保持每周一次的更新频率&#xff0c;已经渗透到全球汽车产业企业。在2024年初&#xff0c;进行了大规模的功能更新&#xff01;不仅对软件进行了全面优化&#xff0c;同…

python入门基础:深入了解Python开发工具,PyCharm安装运行详解

Python 是一种解释型语言&#xff0c;通常不需要像 C 或 C 那样的传统编译过&#xff0c;上一篇写了关于下载安装Python解释器的安装以及使用的详解&#xff0c;接下来写有一些工具更有助于开发、编译和打包 Python 项目的&#xff1a;vscode、pycharm、pip。 以下是关于的 Py…

六西格玛培训对薪资的真实影响:不只是数字的变化

近年来&#xff0c;提升自身能力、寻求职业突破成为了许多职场人士的共同追求。其中&#xff0c;六西格玛培训作为一种先进的质量管理方法&#xff0c;受到了不少企业和个人的青睐。那么&#xff0c;六西格玛培训对个人的薪资水平究竟有何影响&#xff1f;本文&#xff0c;天行…

AwesomeTechnologyWeekly值的关注的中文社区优质技术周刊一览

作为开发者&#xff0c;我们每天都需要吸收大量的信息补充我们的知识体系. Awesome Technology Weekly Zh-Hans 项目收集了中文技术社区各个领域的高质量的中文技术月/周/日刊&#xff0c;定时刷新获取最新一期中文技术月/周/日刊进行展示. 访问网站开始关注吧~&#xff1a;ht…

Python - getpass

文章目录 关于 getpass基本使用语法说明其它 关于 getpass getpass 是 Python 自带标准库 Python 官方文档 - getpass https://docs.python.org/3/library/getpass.html 基本使用 我们在看视频教程中&#xff0c;老师如果不想在代码中暴露 token、密码之类的信息&#xff0c…

巧【二叉搜索树的最近公共祖先】【二叉搜索树的性质】Leetcode 235. 二叉搜索树的最近公共祖先

【二叉搜索树的最近公共祖先】【二叉搜索树性质】Leetcode 235. 二叉搜索树的最近公共祖先 【巧】解法1 利用二叉搜索树有序的性质解法2 采用二叉树求最近公共祖先的方法——后序遍历 ---------------&#x1f388;&#x1f388;235. 二叉搜索树的最近公共祖先 题目链接&#x…

帮公司面试了个要25K的测试,我问了他这些问题...

深耕IT行业多年&#xff0c;我们发现&#xff0c;对于一个程序员而言&#xff0c;能去到一线互联网公司&#xff0c;会给我们以后的发展带来多大的影响。 很多人想说&#xff0c;这个我也知道&#xff0c;但是进大厂实在是太难了&#xff0c;简历投出去基本石沉大海&#xff0…