网站首页 > 博客文章 正文
话不多说,今天主题就是Java中对象属性的复制!
私以为这种需求主要可以分为两种解决方案:源码编写实现和反射调用实现(Json序列化转换不在此列)。
反射实现非常灵活,也算是Java项目中针对这类需求使用最多的实现方式了。很多常用的工具包中都有类似的实现,像HuTool中的CopyUtil,Spring中的BeanUtils都提供相关功能。
今天我们来尝试用一种不用自己直接编巨量代码的源码方式实现属性的复制。
[思考]MapStruct [灵光一闪]
MapStruct是一个用于生成类型安全的Java bean映射类的注解处理器,通过简单的注解和声明,在编译期间自动生成映射代码。相当于友好地代替我们自己手动写很多的先get属性,再set属性的相关代码,再结合Lombok,简直爽到起飞!
因为它是在编译期直接生成的代码,等到运行的时候基本就是和我们手写代码调用一样的高性能了,避免过多地使用反射,导致系统整体性能遇到瓶颈。
MapsStruct支持很多灵活的自定义配置和操作,像常见的忽略属性,忽略空值,默认值处理,多对象合并等等都可以通过简单的注解属性设置达到目的。
在许多情况下,MapStruct会自动处理类型转换。比如,你可以定义两个类User和UserDto,并通过@Mapper注解创建一个UserDtoToUser的映射器,然后使用该映射器将UserDto对象转换为User对象。
@Mapper
public interface UserMapper {
UserDtoToUser toUser(UserDto userDto);
}
如果你需要转换的类型不止一种,MapStruct也支持使用@Mapping注解进行自定义映射。例如,你可以定义一个UserSpaceConvert类,通过使用@Mapping注解进行类方法的映射/转换。
示例代码如下:
@Mapper(componentModel = "spring")
public interface UserSpaceConvert {
@Mapping(target = "userId", source = "user.id")
@Mapping(target = "userName", source = "user.name")
@Mapping(target = "userAge", source = "user.age")
UserSpaceEntity convertToUserSpaceEntity(User user);
}
在调用的地方也很简单:
UserMapper mapper
= Mappers.getMapper(UserMapper.class);
User target = mapper.toUser(userSto);
System.out.println(target.getUserName());
- 上一篇: 反射用不好真的会影响代码执行效率!
- 下一篇: J2eeFAST 开源平台(j2ee开发工具)
猜你喜欢
- 2024-11-12 基于SpringBoot 的CMS系统,拿去开发企业官网真香(附源码)
- 2024-11-12 解决JAVA压缩图片变色问题(java压缩图片至指定大小)
- 2024-11-12 J2eeFAST 开源平台(j2ee开发工具)
- 2024-11-12 反射用不好真的会影响代码执行效率!
- 2024-11-12 基于AbstractProcessor扩展MapStruct自动生成实体映射工具类
- 2024-11-12 Java面试问题(一)—— java 基础(java面试问题大全及答案大全)
- 2024-11-12 一个轻量级的Java快速开发平台快速开发项目并交付「接私活利器」
- 2024-11-12 电商系统中的 ID 是如何生成的?(电商注册账号是什么)
- 2024-11-12 用了这两款插件,同事再也不说我代码写的烂了
- 2024-11-12 优雅的替换第三方jar包中的类!#编程
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- powershellfor (55)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)