Java反射与自定义注解实现不同Bean属性映射的高效解决方案
假设现有一个叫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对象 } }
标签:
javase
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通