将父类的属性赋值给子类(利用反射)

public class A {
    private String a;
    private String b;

    public String getA() {
        return a;
    }

    public void setA(String a) {
        this.a = a;
    }

    public String getB() {
        return b;
    }

    public void setB(String b) {
        this.b = b;
    }
}
public class B extends A {
    private String c;
    private String d;

    public String getC() {
        return c;
    }

    public void setC(String c) {
        this.c = c;
    }

    public String getD() {
        return d;
    }

    public void setD(String d) {
        this.d = d;
    }
}

假如有A类和B类两个实体类,B类是继承于A类的,现在想要将A类中的 a属性和 b属性赋值给B类中的a属和b属性.第一次我尝试的方法是 将A类转为B类.这是一个错误的想法,因为在继承中是不能向下转型的.就比如一个乐器中有萨克斯和小提琴,你可以说小提琴是乐器,但是不能说乐器就是小提琴.然后又查阅资料,了解到使用反射能够在运行时得到一个类的各种信息,所以想法是将想要转变的父类和子类传入方法中,然后运用反射将父类中的参数名以及值取出来(此时想要取值的话是通过调用get参数名这个方法来取得,例如,有一个 msg参数,实体类中有getMsg方法才行).取出来后即可将值赋值给传入的子类.

下面是源代码

/**
 * @program: demo
 * @description: 反射
 * @author: hu_pf@suixingpay.com
 * @create: 2018-03-29 16:02
 **/
public class Demo11 {
    public static void main(String[] args) throws Exception {
        A a=new A();
        B b=new B();
        a.setA("a");
        a.setB("b");
        fatherToChild(a,b);
        System.out.println(b.getA());
    }


    public static <T>void fatherToChild(T father,T child) throws Exception {
        if (child.getClass().getSuperclass()!=father.getClass()){
            throw new Exception("child 不是 father 的子类");
        }
        Class<?> fatherClass = father.getClass();
        Field[] declaredFields = fatherClass.getDeclaredFields();
        for (int i = 0; i < declaredFields.length; i++) {
            Field field=declaredFields[i];
            Method method=fatherClass.getDeclaredMethod("get"+upperHeadChar(field.getName()));
            Object obj = method.invoke(father);
            field.setAccessible(true);
            field.set(child,obj);
        }

    }

    /**
     * 首字母大写,in:deleteDate,out:DeleteDate
     */
    public static String upperHeadChar(String in) {
        String head = in.substring(0, 1);
        String out = head.toUpperCase() + in.substring(1, in.length());
        return out;
    }
}
  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值