java使用反射复制Bean

流程:先创建目标对象的实例,然后根据字段名称和类型匹配目标对象和被复制对象相同的字段,再用setAccessible()获取访问private类型字段的权限,最后赋值给目标对象的实例。

方法:

public static <T1, T2> T2 copyBean2Bean(T1 obj, Class toClass) {
Class fromClass = obj.getClass();//源数据类

    T2 toObj = null;

    try {
        toObj = toClass.newInstance();/*获取实例*/
    } catch (InstantiationException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }


    /*
     *getDeclaredFields()获得某个类的所有声明的字段,包括public、private和proteced,不包括父类的声明字段。
     * getFields()获得某个类的所有的public的字段,包括父类中的字段。
     * */
    Field[] fromClassFields = fromClass.getDeclaredFields();


    Field toClassFiled = null;
    for (Field filed : fromClassFields) {

        try {
            toClassFiled = toClass.getDeclaredField(filed.getName());//toClass中名称是filed.getName()Filed
        } catch (NoSuchFieldException e) {
            System.out.println("toClassFiled没有跟filed名称匹配的字段");
            continue;
        }

        if (filed.getName().equals(toClassFiled.getName())
                && filed.getType().getName().equals(toClassFiled.getType().getName())) {/*名称和类型都一样*/

            filed.setAccessible(true);/*获取private字段的访问权限*/
            toClassFiled.setAccessible(true);

            try {
                toClassFiled.set(toObj, filed.get(obj));/*赋值*/
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            filed.setAccessible(false);/*取消权限*/
            toClassFiled.setAccessible(false);
        }

    }

    return toObj;
}

例子
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class People {
private String name;
public int age;
}

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Person {
private String name;
private int age;
}

运行代码:
public class Test {

public static void main(String [] args){
Person person=new Person(“AAA”,18);
People people= EntityUtils.copyObject(person,People.class);
System.out.println(person);
System.out.println(people);
}

}

结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值