Java中的反射机制(二) 一个利用反射进行对象拷贝的例子
2016-11-28 14:31
549 查看
如下例程ReflectTester类进一步演示了Reflection API的基本使用方法。
ReflectTester类有一个copy(Object object)方法,这个方法能够创建一个和参数object同样类型的对象,然后把object对象中的所有属性拷贝到新建的对象中,并将它返回。
这个例子只能复制简单的类,假定类的每个属性都有public类型的getXXX()和setXXX()方法。
ReflectTester类有一个copy(Object object)方法,这个方法能够创建一个和参数object同样类型的对象,然后把object对象中的所有属性拷贝到新建的对象中,并将它返回。
这个例子只能复制简单的类,假定类的每个属性都有public类型的getXXX()和setXXX()方法。
import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; public class ReflectTester { // 该方法实现对Customer对象的拷贝操作 public Object copy(Object object) throws Exception { Class<?> classType = object.getClass(); /* 生成新的对象的讨论 // 获得Constructor对象,此处获取第一个无参数的构造方法的 Constructor cons = classType.getConstructor(new Class[] {});//不带参数,所以传入一个为空的数组 // 通过构造方法来生成一个对象 Object obj = cons.newInstance(new Object[] {}); // 以上两行代码等价于: Object obj11 = classType.newInstance(); // 这行代码无法处理构造函数有参数的情况 //用第二个带参数的构造方法生成对象 Constructor cons2 = classType.getConstructor(new Class[] {String.class, int.class}); Object obj2 = cons2.newInstance(new Object[] {"ZhangSan",20}); */ Object objectCopy = classType.getConstructor(new Class[]{}).newInstance(new Object[]{}); //获得对象的所有成员变量 Field[] fields = classType.getDeclaredFields(); for(Field field : fields) { //获取成员变量的名字 String name = field.getName(); //获取成员变量的名字,此处为id,name,age //System.out.println(name); //获取get和set方法的名字 String firstLetter = name.substring(0,1).toUpperCase(); //将属性的首字母转换为大写 String getMethodName = "get" + firstLetter + name.substring(1); String setMethodName = "set" + firstLetter + name.substring(1); //System.out.println(getMethodName + "," + setMethodName); //获取方法对象 Method getMethod = classType.getMethod(getMethodName, new Class[]{}); Method setMethod = classType.getMethod(setMethodName, new Class[]{field.getType()});//注意set方法需要传入参数类型 //调用get方法获取旧的对象的值 Object value = getMethod.invoke(object, new Object[]{}); //调用set方法将这个值复制到新的对象中去 setMethod.invoke(objectCopy, new Object[]{value}); } return objectCopy; } public static void main(String[] args) throws Exception { Customer customer = new Customer("Tom",20); customer.setId(1L); ReflectTester tester = new ReflectTester(); Customer customer2 = (Customer)tester.copy(customer); System.out.println(customer2.getId() + "," + customer2.getName() + "," + customer2.getAge()); } } class Customer { private long id; private String name; private int age; public Customer() { } public Customer(String name, int age) { this.name = name; this.age = age; } public long getId() { return id; } public void setId(long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
相关文章推荐
- Java中的反射机制(二) 一个利用反射进行对象拷贝的例子
- Java中的反射机制(二) 一个利用反射进行对象拷贝的例子
- Java中的反射机制 一个利用反射进行对象拷贝的例子
- Java中的反射机制(二) 一个利用反射进行对象拷贝的例子
- 一个利用反射进行对象拷贝的例子
- JAVA中利用反射机制进行对象和Map相互转换的方法
- 利用Java的反射机制解析一个Class对象的详细内容(工具方法留用)
- 利用java 反射机制来实现一个servlet处理多种请求
- java中使用反射做一个工具类,来为指定类中的成员变量进行赋值操作,使用与多个类对象的成员变量的赋值。
- 如何利用java的反射机制动态的取得对象的属性?
- Java数组反射实现动态的判断一个对象书否是数组,并且对数组进行拆包输出 。。
- 一个新的对象创建机制的思考--C++下实现类似于Java的对象管理机制及反射
- 深度复制一个对象方法。利用反射机制,不使用Serialization,也不使用ICloneable接口
- Java数组反射实现动态的判断一个对象书否是数组,并且对数组进行拆包输出 。。
- 一个例子了解Java的反射机制
- Java中,利用反射机制修改定义出来的String对象本身。
- 利用Java的反射机制,写了一个简单的仿Gson的解析器
- Java中利用反射原理拷贝对象
- Java中利用反射原理拷贝对象
- JAVA 利用反射机制查询数据库返回相应对象