首页 > 编程语言 >Java反射与自定义注解实现不同Bean属性映射的高效解决方案

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

时间:2023-08-04 11:14:49浏览次数:43  
标签:Java String 自定义 Bean private bean user Date MappingProperty

假设现有一个叫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对象
    }
}

 

标签:Java,String,自定义,Bean,private,bean,user,Date,MappingProperty
From: https://www.cnblogs.com/shamo89/p/17605339.html

相关文章

  • Java获取字符串中首次出现非数字的位置
    /***获取字符串中首次出现非数字的位置*@paramvalue字符串内容*@return首次出现非数字的位置,若无非数字,则返回-1*/publicstaticintgetFirstNonDigitPosInString(Stringvalue){intfirstNonDigitPos=-1;if(TextUtils.i......
  • Java学习笔记(二)
    第二章Java的基础语法2.1Java的注释1、注释是干什么的?给程序员(人)看的,辅助程序员理解代码的解释性的文字。2、注释的形式有3种(1)、单行注释//注释内容(2)、多行注释/* 注释内容1 注释内容2 注释内容3*/(3)、文档注释/** 文档注释内容*/文档注释可以被javadoc.exe工具读取,生......
  • 自定义sonar插件
    第一步:创建插件应用mvnarchetype:generate-DgroupId=com.yy-DartifactId=sonar-yy-plugin-Dpackage=com.yy-Dversion=1.0.0-SNAPSHOT-DarchetypeGroupId=org.apache.maven.archetypes-DarchetypeArtifactId=maven-archetype-quickstart......
  • 【从事Java开发岗位最需要了解什么】
    (文章目录)作为一名Java开发者,要想在职场中脱颖而出,需要具备多方面的知识和能力。以下是从生活、工作、面试、找对象、能力、机会、副业等方面来介绍从事Java开发岗位最需要了解的内容。一、生活1.互联网生态作为一名Java开发者,了解互联网的生态系统,包括了解各类产品的应用场景......
  • Java面试题 P58:微服务篇:你们项目中有没有做过限流?怎么做的?
    单体项目,Tomcat中设置方式见上面:    ......
  • ChatGPT 问答00006 java开源中好用的事件驱动工具类
    在Java开源社区中,有许多强大且好用的事件驱动工具类。以下是其中一些知名的事件驱动框架和库:SpringFramework:Spring框架是一个全功能的开发框架,在其核心模块中,提供了强大的事件驱动机制。通过ApplicationEvent和ApplicationListener接口,你可以轻松地在Spring应用程序中发布和......
  • ChatGPT 问答00007 RxJava介绍
    RxJava是一个基于反应式编程的库,它提供了一套丰富的操作符和数据类型,用于处理异步和事件驱动的编程。它是ReactiveX的Java版本实现,旨在简化异步和并发编程,并提供响应式流式处理的能力。RxJava的核心组件包括以下几个部分:Observable(可观察者):代表一个可被观察的数据流。它......
  • ChatGPT 问答00008 RxJava 使用案例
    RxJava可以应用于各种异步和事件驱动的编程场景。以下是一些RxJava的使用案例:网络请求:使用RxJava可以方便地处理网络请求和响应。你可以使用Retrofit或者其他网络库来发送异步请求,并将其封装为Observable,然后通过操作符进行转换、过滤和合并等操作,最后将结果交给观察者......
  • Java面试题 P57:微服务篇:你们的微服务是怎么监控的?
        ......
  • 【知识点】JAVA之并发集合
    当涉及到多线程编程时,使用并发集合是一种常见的方式来处理多个线程同时访问和操作共享数据的问题。并发集合是一组线程安全的数据结构,可以同时被多个线程访问和修改,而不会导致数据不一致或竞争条件。以下是一些常见的并发集合及其特点:ConcurrentHashMap(并发哈希表):它是一个线程......