两个实体字段不一致,但是字段的值相同 使用注解和反射进行转换 可以避免get和set方法

一个公司两个系统,创建的实体含义一样,但是字段不一致,用get和set方法转换太恶心,而且容易空指针,所以使用注解和反射来写,特地记录一下,有要用的同学可以拿去用哈。

上代码:

java 复制代码
package com.yunda.cross.util;

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

/**
 * 属性名称

 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface FileName {

    String name() default "";
}
java 复制代码
package com.yunda.cross.util;

import java.lang.reflect.Field;
import java.lang.reflect.Method;


public class BeanConvertorUtil {

    /**
     * @author lixiao 90183971
     * @date 2021/5/21 9:02
     * @param src 带属性的实体   target被赋值的实体
     * @return void
     */
    public static Object convertor(Object src,Object target) throws Exception {

        Class<?> srcClz = src.getClass();
        Class<?> targetClz = target.getClass();

        Field[] fields = srcClz.getDeclaredFields();

        for (Field field : fields) {

            field.setAccessible(true);
            //获取属性值
            Object value = field.get(src);
            //获取注解
            FileName annotation = field.getAnnotation(FileName.class);
            if(annotation!=null && annotation.name()!=null){
                //获取当前方法的参数类型
                Class<?>  c = getMethodParamTypes(target,"set" + captureName(annotation.name()));
                Method method = targetClz.getDeclaredMethod("set" + captureName(annotation.name()),c);
                method.setAccessible(true);
                method.invoke(target,value);
            }
        }
        return target;
    }
    //方法首字母大写
    private static String captureName(String name) {
        name = name.substring(0, 1).toUpperCase() + name.substring(1);
        return name;
    }
    //获取方法的类型
    private static Class<?>  getMethodParamTypes(Object classInstance,String methodName){
        //全部方法
        Method[]  methods = classInstance.getClass().getMethods();
        Class<?> param = null;
        for (int  i = 0;  i< methods.length; i++) {
            //和传入方法名匹配
            if(methodName.equals(methods[i].getName())){
                param = methods[i].getParameterTypes()[0];
            }
        }
        return param;
    }

}

使用:

public static void main(String[] args) {

复制代码
Test1Po test1Po = new Test1Po();
test1Po.setAgeA("a");
test1Po.setClassNameA("c");
test1Po.setEmailA("e");
test1Po.setParentA("p");
Test2Po test2Po = new Test2Po();

try {
    System.out.println(JSON.toJSONString(copy(test1Po, test2Po)));
} catch (Exception e) {
    e.printStackTrace();
}

}

java 复制代码
package com.yunda.cross.util;

import org.springframework.stereotype.Component;


public class Test1Po {

    @FileName(name = "name")
    private String nameA;

    @FileName(name = "sex")
    private String sexA;

    @FileName(name = "age")
    private String ageA;

    @FileName(name = "email")
    private String emailA;

    @FileName(name = "className")
    private String classNameA;

    @FileName(name = "parent")
    private String parentA;

    public String getNameA() {
        return nameA;
    }

    public void setNameA(String nameA) {
        this.nameA = nameA;
    }

    public String getSexA() {
        return sexA;
    }

    public void setSexA(String sexA) {
        this.sexA = sexA;
    }

    public String getAgeA() {
        return ageA;
    }

    public void setAgeA(String ageA) {
        this.ageA = ageA;
    }

    public String getEmailA() {
        return emailA;
    }

    public void setEmailA(String emailA) {
        this.emailA = emailA;
    }

    public String getClassNameA() {
        return classNameA;
    }

    public void setClassNameA(String classNameA) {
        this.classNameA = classNameA;
    }

    public String getParentA() {
        return parentA;
    }

    public void setParentA(String parentA) {
        this.parentA = parentA;
    }
}
java 复制代码
package com.yunda.cross.util;


public class Test2Po {
    private String name;
    private String sex;
    private String age;
    private String email;
    private String className;
    private String parent;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getClassName() {
        return className;
    }

    public void setClassName(String className) {
        this.className = className;
    }

    public String getParent() {
        return parent;
    }

    public void setParent(String parent) {
        this.parent = parent;
    }
}
相关推荐
凤山老林1 小时前
新一代Java应用日志可视化与监控系统开源啦
java·后端·开源
流星白龙1 小时前
【Qt】7.信号和槽_connect函数用法(2)
java·数据库·qt
金涛03191 小时前
QT-day2,信号和槽
开发语言·qt·命令模式
黎宇幻生5 小时前
Java全栈学习笔记39
java·笔记·学习
Aurorar0rua5 小时前
C Primer Plus Notes 09
java·c语言·算法
nongcunqq6 小时前
abap 操作 excel
java·数据库·excel
R-G-B7 小时前
【02】C#入门到精通——C# 变量、输入/输出、类型转换
开发语言·c#·c# 变量·c#输入/输出·c#类型转换
星河队长7 小时前
C# 软件加密方法,有使用时间限制,同时要防止拷贝
开发语言·c#
史迪奇_xxx7 小时前
10、一个简易 vector:C++ 模板与 STL
java·开发语言·c++
2301_801252227 小时前
Java中的反射
java·开发语言