【对象属性拷贝】⭐️按照需要转换的类型反射设置拷贝后对象的属性

背景:

        小伙伴们大家好,最近开发的时候遇到一种情况,项目引入了全局序列化器来实现Date,LocalDateTime类型的字段根据时区转换,总体来说接口没什么要改动的,只要原来字段的属性是以上两种就行,但是存在一些String类型的日期字段,该种类型日期字段需要手动改为Date或者LocalDateTime类型

思路:

        因为只用改动String类型的字段,实体类的其他属性直接复制原来的就行,所以直接借助springboot框架中对象拷贝的工具类,然后自定义String类型的日期转换即可

自定义赋值过程源码、如下

//是一个泛型方法
public static <T> T copyAndConvertDate(Object source, Class<T> target, String... dataTimeFields) {//source:源对象,就是要从中复制属性值的对象//target:目标类,要创建并接收复制属性的目标类//dateTimeFields: 哪些日期字段要处理T copiedObject = BeanUtils.instantiateClass(target);//创建目标类的实例BeanUtils.copyProperties(source, copiedObject);//源对象属性值 》》 目标对象BeanWrapperImpl beanWrapper = new BeanWrapperImpl(copiedObject);//用来操作目标对象的属性for (String field : dataTimeFields) {try {Field declaredField = source.getClass().getDeclaredField(field);declaredField.setAccessible(true);String fieldValue = (String) declaredField.get(source);//反射获取源对象中对应的指定字段,并设置为可以访问(因为是私有属性)if (fieldValue != null && fieldValue.matches("\\d{2}-[a-zA-Z]{3}-\\d{4}")) {//这种格式的“23-Jan-2024"的值,走该处理代码Date dateTime = new SimpleDateFormat("dd-MMM-yyyy", Locale.US).parse(fieldValue);//解析为Date对象beanWrapper.setPropertyValue(field, dateTime);//更改目标对象指定字段的属性值} else {Date dateTime = new SimpleDateFormat("yyyy-MM-dd HH:mm").parse(fieldValue);beanWrapper.setPropertyValue(field, dateTime);}} catch (Exception e) {e.printStackTrace();log.error("拷贝对象属性:{} -> {} 出错", field, target);}}return copiedObject;//返回目标对象}

apipost测试下

原先的实体类

@Data
public class BlockStructureVO {private String issueTime;...//其他属性
}

 目标实体类

@Data
public class NewBlockStructureVO {private Date issueTime;...//其他属性不变}

 转换代码块

NewBlockStructureVO newBlockStructureVO = BeanUtil.copyAndConvertDate(blockStructureVO, NewBlockStructureVO.class, "issueTime");
//source: blockStructureVO
//target:  NewBlockStructureVO.class
//指定字段:issueTime

调试一下看看旧的对象和新的对象区别

旧的

新的

对比发现确实只有指定的字段值改变了,别的属性与旧的对象属性相同

章末

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

react+ts

1.概念 React和TypeScript集合使用的重点集中在 存储数据/状态有关的Hook函数以及组件接口的位置&#xff0c;这些地方最需要数据类型校验 2.使用Vite创建项目 Vite是前端工具链工具&#xff0c;可以帮助我们快速创建一个 reactts 的工程化环境出来 Vite官网&#xff1a;ht…

【C++】文件IO

目录 一、C语言的输入输出二、流的概念三、operator bool四、C文件IO流ifstream和ofstreamostringstream和istringstreamstringstream 一、C语言的输入输出 C语言中我们用到的最频繁的输入输出方式就是 scanf() 和 printf()。 scanf()&#xff1a; 从标准输入设备&#xff08…

GitHub的使用操作

记得看目录哦&#xff01; 1. 创建仓库2. 下载desktop3. 把创建的库克隆到本地4. 文件拷贝到本地仓库![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/7171ac6c4ca14e3b8d22717121f79c9e.png)5. 在网址后面加/compare进行比较6. 给系统添加功能 1. 创建仓库 2. 下载…

微信小程序 安卓/IOS兼容问题

一、背景 在开发微信小程序时&#xff0c;不同的手机型号会出现兼容问题&#xff0c;特此记录一下 二、安卓/IOS兼容问题总结 2.1、new Date()时间转换格式时&#xff0c;IOS不兼容 问题&#xff1a;在安卓中时间格式2024-1-31 10:10:10&#xff0c;但是在iOS中是不支持 &q…

LeetCode383. 赎金信

383. 赎金信 给你两个字符串&#xff1a;ransomNote 和 magazine &#xff0c;判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以&#xff0c;返回 true &#xff1b;否则返回 false 。 magazine 中的每个字符只能在 ransomNote 中使用一次。 示例 1&#xff1…

工业智能网关构建智慧污水处理远程监测及管理

污水处理厂是为了处理生活污水和工业废水而建立的设施。为了监测和控制污水处理过程&#xff0c;现代污水处理厂采用了智能工业网关物联网技术。智慧污水系统能够通过工业网关远程监测厂内各个环节的运行情况&#xff0c;提高处理效率和管理水平。 智能工业网关能够将不同设备…

Vue3学习记录(二)--- 组合式API之计算属性和侦听器

一、计算属性 1、简介 ​ 计算属性computed()&#xff0c;用于根据依赖的响应式变量的变化&#xff0c;进行自动的计算&#xff0c;并返回计算后的结果。当依赖的响应式变量发生变化时&#xff0c;computed()会自动进行重新计算&#xff0c;并返回最新的计算结果。如果依赖的…

9 个成功的会员网站案例

对于许多数字创作者来说&#xff0c;会员网站可以改变游戏规则。 当您建立一个会员网站时&#xff0c;您不仅会提高收入。也可以根据您的主题或想法创建有意义的业务。围绕这种想法将人们联系起来。 如果您正在考虑创建一个会员网站 或想要修改您的会员网站&#xff0c;我们将…

【Chrono Engine学习中总结】1-安装配置与程序运行

本文仅用于个人安装记录。 官方安装教程 https://api.projectchrono.org/8.0.0/tutorial_install_chrono.html Windows下安装 windows下安装就按照教程好了。采用cmake-gui进行配置&#xff0c;建议首次安装只安装核心模块。然后依此configure下irrlicht&#xff0c;sensor…

vue3前端开发,element-plus前端框架探秘:scope对象

vue3前端开发&#xff0c;element-plus前端框架探秘:scope对象&#xff01;我们经常需要对当前行的数据进行操作&#xff0c;比如增加&#xff0c;删除&#xff0c;编辑等&#xff0c;为此我们需要传递当前行所对应的唯一主键,通常情况下&#xff0c;当前行对应的业务主键是id属…

Camille-学习笔记-web基础知识

web基础1.系统架构 B/S :Browser/Server 网站 界面层&#xff08;UI&#xff09; 业务逻辑层&#xff08;业务&#xff09; 数据访问层&#xff08;数据库&#xff09; 静态网页&#xff1a;和服务器没有数据交互 动态网页&#xff1a;网页数据可以和服务器进行数据交互 URL…

C++学习Day01之C++对C语言增强和扩展

目录 一、程序及输出1.1 全局变量检测增强1.2 函数检测增强1.3 类型转换检测增强1.4 struct增强1.5 bool类型扩展1.6 三目运算符增强1.7 const增强1.7.1 全局Const对比1.7.2 局部Const对比1.7.3 Const变量初始化数组1.7.3 Const修饰变量的链接性 二、分析总结 一、程序及输出 …