类属性转换 拷贝 赋值
参考链接 https://www.cnblogs.com/CodeBlogMan/p/18005657
三、类属性转换
在实际 Java 开发中,关于 VO、Entity、DTO 等对象属性之间的赋值是我们经常遇见的,最简单使用 @Data 去逐个 .set() 或者 @Builder 链式 .build(),其实都是很靠谱的办法,而且可以控制颗粒度。但属性一多起来的话,比如二十个以上,那么代码就会显得很长。所以有没有办法一行代码就搞定类属性转换呢?
首先不推荐使用 BeanUtils.copyProperties() 作类属性的拷贝,以下是几个常见的坑:
- 同一字段分别使用包装类型和基本类型,会出现转换异常,不会灵活识别转换
- null 值覆盖导致数据异常,即源属性有值为 null,但是目标属性有正常值,拷贝后会被 null 覆盖
- 内部类属性无法正常拷贝,即使类型和字段名均相同也无法拷贝成功,这个真的很坑
推荐泛型 + JSON组合的方式来实现类属性的转换,具体步骤如下:
-
定义一个父类 CommonBean,让项目里所有 VO、Entity、DTO 等类都继承该类,类里面就只定义一个公共的泛型方法即可:
public class CommonBean implements Serializable { /** * @apiNote 全局类型转换方法:入参和返参均支持泛型 * @param target * @return 目标类型 * @param <T> */ public <T> T copyProperties(Class<T> target) { //本质上就是进行了 Object -> json字符串 -> 到指定类型的转换 return JSON.parseObject(JSON.toJSONString(this), target); } }
-
在需要转换的地方,直接调用上面定义的方法即可完成转换:
@Test public void testCopyProperties(){ //Worker 和 WorkerVO 都需要 extends 上述的 CommonBean Worker worker = new Worker(); worker.setName("Alex"); worker.setStatus(NumberUtils.INTEGER_ONE); //直接使用,得到需要的目标 VO 对象 WorkerVO workerVO = worker.copyProperties(WorkerVO.class); log.info("转换结果:{}",workerVO); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)