专业的编程技术博客社区

网站首页 > 博客文章 正文

Java项目中用它来代替一半的反射使用,爽到飞起!

baijin 2024-11-12 09:38:23 博客文章 4 ℃ 0 评论

话不多说,今天主题就是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());

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表