Java反射 - 2(对象复制,父类域)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java反射 - 2(对象复制,父类域)相关的知识,希望对你有一定的参考价值。
为什么要复制对象?假设有个类Car,包含name,color2个属性,那么将car1对象复制给car2对象,只需要car2.setName(car1.getName)与car2.setColor(car1.getColor)两部操作即可。
实际项目中有很多类都有超过几十个,甚至上百个字段,这时如果采用以上方式,将会有很大的代码工作量与重复劳动。解决方法是使用反射机制。
首先有2个类如下
1 /** 2 * Created by yesiming on 16-11-19. 3 */ 4 public class Car { 5 private String name; 6 private String color; 7 // 省略set/get 8 } 9 }
1 /** 2 * Created by yesiming on 16-11-20. 3 */ 4 public class Kia extends Car{ 5 private String model; 6 // 省略set/get 7 }
我们先操作入职Kia的域
1 /** 2 * 通过反射进行对象复制(漏洞:不能复制父类中的域) 3 * @throws Exception 4 */ 5 @Test 6 public void copyObject() throws Exception{ 7 User src = new User(); // 源对象 8 src.setId(1); 9 src.setName("yesiming"); 10 User target = new User(); // 目标对象 11 Class clazz = User.class; 12 Field[] fields = clazz.getDeclaredFields(); // 得到该类声明的域(不包含父类的域) 13 for(Field field : fields) { 14 if(!field.isAccessible()) 15 field.setAccessible(true); // 设置可访问 16 field.set(target, field.get(src)); // 从源对象get值set到目标对象 17 } 18 // 输出显示 19 for(Field field : fields) { 20 System.out.println(field.get(target)); 21 } 22 }
由于getDeclaredFields方法不能得到超类中的域,所以上述操作有缺陷,甚至不具有实际意义
下面是如何得到超类中的域,使用递归即可
1 /** 2 * 输出所有域,包括父类中的域(通过递归实现) 3 */ 4 public void showAllField(Class clazz) { 5 Field[] fields = clazz.getDeclaredFields(); 6 System.out.println("------" + clazz.toString() + "------"); 7 if(fields != null && fields.length > 0) { 8 for(Field field : fields) { 9 System.out.println(field); 10 } 11 } 12 Class superClazz = clazz.getSuperclass(); 13 if(superClazz != Object.class) { // 结束递归 14 showAllField(superClazz); // 递归 15 } 16 } 17 18 @Test 19 public void showAllFieldTest() { 20 Class clazz = Kia.class; 21 showAllField(clazz); 22 }
运行结果如下:
------class o1.o1_a.Kia------ private java.lang.String o1.o1_a.Kia.model ------class o1.o1_a.Car------ private java.lang.String o1.o1_a.Car.name private java.lang.String o1.o1_a.Car.color
结合上述2种操作,就能写出具有实用价值的类复制方法了吧
以上是关于Java反射 - 2(对象复制,父类域)的主要内容,如果未能解决你的问题,请参考以下文章