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

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

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;

/**
 * 属性名称
 * @author lixiao 90183971
 * @date 2021/5/21 9:06
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface FileName {

    String name() default "";
}
package com.yunda.cross.util;

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

/**
 * @author 李校
 * @date 2021-05-21 09:00:42
 */
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();
        }
    }
package com.yunda.cross.util;

import org.springframework.stereotype.Component;

/**
 * @author 李校
 * @date 2021-05-21 09:03:41
 */
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;
    }
}
package com.yunda.cross.util;

/**
 * @author 李校
 * @date 2021-05-21 09:03:48
 */
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
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值