两个实体字段不一致,但是字段的值相同 使用注解和反射进行转换 可以避免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;
    }
}
相关推荐
rit84324995 分钟前
LTE系统资源分配MATLAB实现示例(基于OFDMA的动态调度)
开发语言·matlab
Tony6666888889 分钟前
Webservic 服务注册发布及参数封装-实际项目应用
java·spring·servlet
老华带你飞12 分钟前
零食商城|基于springboot + vue零食商城管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·毕设
chilavert31814 分钟前
技术演进中的开发沉思-231 Ajax:页面内容修改
开发语言·前端·javascript
李日灐15 分钟前
C++STL:熟悉vector的底层实现,部分源码解析,迭代器失效和深层次浅拷贝
开发语言·c++
wuk99820 分钟前
基于MATLAB的混合动力汽车(HEV)简单整车模型实现
开发语言·matlab·汽车
偶像你挑的噻20 分钟前
1.Qt-编译器基本知识介绍
开发语言·qt
songgz21 分钟前
多线程双向 JSON 解析器
java·服务器·json
开心香辣派小星22 分钟前
23种设计模式-19策略模式(Strategy Pattern)
java·设计模式·策略模式
天天进步201524 分钟前
拒绝“玄学”Bug:C++ 多线程调试指南与 ThreadSanitizer 实战
开发语言