Java反射与自定义注解实现不同Bean属性映射的高效解决方案

发布时间 2023-08-04 11:05:57作者: 夏威夷8080

假设现有一个叫user的bean,里面有username、passsword、sex、createTime这四个属性,需要实现一个功能,把其它bean里的字段分别映射到user里的username、passsword、sex、createTime这几个属性上,然后可以根据其它的bean的实例自动转化为user的实例(填充对应属性值),下面是代码实现。

Java反射与自定义注解实现不同Bean属性映射的高效解决方案

两个不同的user bean

@Data
public class User {
    private String username;
    private String password;
    private String sex;
    private Date createTime;

}
@Data
public class UserInfo {
    @MappingProperty("username")
    private String name;

    @MappingProperty("password")
    private String pwd;

    @MappingProperty("sex")
    private String gender;

    @MappingProperty("createTime")
    private Date createdAt;

}

自定义注解

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @Author: 夏威夷8080
 * @Date: 2023/8/4 10:46
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@interface MappingProperty {
    String value();
}

映射处理类

import java.lang.reflect.Field;

public class BeanMapper {
    public static User mapToUser(Object bean) throws IllegalAccessException {
        User user = new User();

        Field[] userFields = User.class.getDeclaredFields();

        // 遍历bean的所有字段
        for (Field field : bean.getClass().getDeclaredFields()) {
            field.setAccessible(true);

            // 获取字段上的自定义注解
            MappingProperty mappingProperty = field.getAnnotation(MappingProperty.class);
            if (mappingProperty != null) {
                String propertyName = mappingProperty.value();

                // 遍历user类的字段,查找匹配的属性名
                for (Field userField : userFields) {
                    if (userField.getName().equals(propertyName)) {
                        userField.setAccessible(true);
                        userField.set(user, field.get(bean)); // 设置属性值
                        break;
                    }
                }
            }
        }

        return user;
    }
}

测试类

import java.util.Date;

/**
 * @Author: 夏威夷8080
 * @Date: 2023/8/4 10:37
 */
public class Test {
    public static void main(String[] args) throws IllegalAccessException {
        UserInfo userInfo = new UserInfo();
        userInfo.setName("John");
        userInfo.setPwd("123456");
        userInfo.setGender("Male");
        userInfo.setCreatedAt(new Date());

        User user = BeanMapper.mapToUser(userInfo);

        System.out.println(user.getUsername()); // 输出:John
        System.out.println(user.getPassword()); // 输出:123456
        System.out.println(user.getSex()); // 输出:Male
        System.out.println(user.getCreateTime()); // 输出:对应的Date对象
    }
}