子类对象获得父类对象的所有属性值的三种方法

子类对象获得父类对象的所有属性值的三种方法

最近碰到一个问题,子类对象如何快速获得父类对象的所有属性?起初有以下几种想法。

  • 通过set方法把父类属性一个个注入子类
  • 通过反射获得父类的所有字段对象,然后同样通过反射把属性注入子类对象(有坑)
  • 通过Spring的工具类

下面我就简单介绍一下这几种方法。

首先我们准备两个简单的测试类,一个父类,一个子类。这里省略了一系列set,get…的乱七八糟的方法

//父类
public class Father {
    private String name;
    private Integer age;
}
//子类
public class Son extends Father{
    private String sex;
}

接下来就是测试方法。我准备了三个测试方法,分别测试上述的三种方法。

通过set方法把父类属性一个个注入子类

  • 优点:简单
  • 缺点:有时候不简单

这是我们初学者最常用的一种方法,使用起来非常快乐,但是当父类的属性达到两位数时,不断地set就变得痛苦了起来…

 @Test
    void test1() {
        //法一:把父类属性逐个set进子类
        //缺点:当父类属性太多时,代码太多,一不小心就会忘记set某个值
        Father father = new Father("张三", 35);
        Son son = new Son();
        son.setName(father.getName());
        son.setAge(father.getAge());
        son.setSex("男");
        System.out.println(son);
    }

通过反射获得父类的所有字段对象,然后同样通过反射把属性注入子类对象 (有坑)

  • 优点:代码简洁,装逼
  • 缺点:可读性不强

通过反射给循环给子类赋值,这样当父类属性多起来时代码不仅不会显得很乱,反而会显得很简洁。最主要的是,用反射感觉很6,当同学看不懂时,你可以轻轻松松装一手。话不多说,上代码!

 @Test
    void test2() throws Exception {
        //法二:通过反射给子类属性赋值,有坑哦
        Father father = new Father("张三", 18);
        //创建子类对象
        Son son = new Son();
        //获得子类class对象
        Class<? extends Son> sonClass = son.getClass();
        //获得父类对象的所有公共字段
        Field[] fields = father.getClass().getFields();
        //循环父类所有的字段
        for (Field field : fields) {
            //父类属性名
            String name = field.getName();
            //父类属性值
            Object value = field.get(father);
            //获得子类与父类对应的属性
            Field sonClassField = sonClass.getField(name);
            //给子类的属性赋值
            sonClassField.set(son, value);
        }
        //然后给子类独有的属性单独赋值
        son.setSex("男");
    }

这个方法的限制性很强,这个测试方法只有在将子类和父类的属性都改成public时才能跑通。表面原因在 getFields()getDeclaredFields() 上面,最主要的还是因为父类私有属性不能继承。这里简单解释一下,getDeclaredFields() 方法能获得类本身的所有属性但不能获得从父类那继承过来的属性, getFields() 方法能够获得本类和父类的所有公有属性。

通过Spring的工具类

这个方法一眼无敌,鉴定为神中神!

  • 优点:最简洁,最简单
  • 缺点:无
@Test
    void test3() {
        //法三:通过拷贝对象方法(注:需要有spring的包)
        Father father = new Father("张三", 18);
        Son son = new Son();
        BeanUtils.copyProperties(father, son);
        son.setSex("男");
        System.out.println(son.getName());
    }

以上就是我想到的三种方法,由于作者水平有限,如果大家有更好的方法欢迎分享出来一起学习哈!!!

通过Java反射机制,可以通过类对象获取类及类的所有属性。可以使用 `Class.getDeclaredFields()` 方法获取一个类的所有属性,包括私有属性。同时,需要使用 `Class.getSuperclass()` 方法获取类的Class对象,然后再获取类的属性。下面是一个示例代码: ```java import java.lang.reflect.Field; public class Parent { private int parentField; // 省略getter和setter方法 } public class Child extends Parent { private int childField; // 省略getter和setter方法 } public class Main { public static void main(String[] args) throws Exception { Child child = new Child(); child.setParentField(1); child.setChildField(2); // 获取类的属性 Field[] childFields = child.getClass().getDeclaredFields(); for (Field field : childFields) { field.setAccessible(true); System.out.println("Child field: " + field.getName() + " = " + field.get(child)); } // 获取类的属性 Field[] parentFields = child.getClass().getSuperclass().getDeclaredFields(); for (Field field : parentFields) { field.setAccessible(true); System.out.println("Parent field: " + field.getName() + " = " + field.get(child)); } } } ``` 在上述代码中,我们首先创建了一个Child对象,然后通过反射机制获取类的所有属性类的所有属性。注意,我们需要使用 `Field.setAccessible(true)` 方法来设置属性可访问,否则私有属性无法访问。运行上述代码,即可看到类及类的所有属性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值