子类对象获得父类对象的所有属性值的三种方法
最主要的是,用反射感觉很6,当同学看不懂时,你可以轻轻松松装一手。这里简单解释一下,getDeclaredFields() 方法能获得类本身的所有属性但不能获得从父类那继承过来的属性,这是我们初学者最常用的一种方法,使用起来非常快乐,但是当父类的属性达到两位数时,不断地set就变得痛苦了起来…这个方法的限制性很强,这个测试方法只有在将子类和父类的属性都改成public时才能跑通。以上就是我想到的三
子类对象获得父类对象的所有属性值的三种方法
最近碰到一个问题,子类对象如何快速获得父类对象的所有属性?起初有以下几种想法。
- 通过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());
}
以上就是我想到的三种方法,由于作者水平有限,如果大家有更好的方法欢迎分享出来一起学习哈!!!
更多推荐
所有评论(0)