使用反射复制一个JavaBean的对象
先看代码吧:
- package com.java.study;
- import java.io.Serializable;
- import java.lang.reflect.Field;
- import java.lang.reflect.InvocationTargetException;
- import java.lang.reflect.Method;
- public class ReflectTester {
- public Object copy(Object object) throws IllegalArgumentException, SecurityException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
- Class classType = object.getClass();//获得对象的类型
- System.out.println("Class:" + classType.getName());
- //通过默认的构造函数创建一个新的对象
- Object objectCopy = classType.getConstructor(new Class[] {}).
- newInstance(new Object[] {});
- //获得对象的所有属性
- Field fields[] = classType.getDeclaredFields();
- for(int i = 0; i < fields.length; i++) {
- Field field = fields[i];
- String fieldName = field.getName();
- String firstLetter = fieldName.substring(0,1).toUpperCase();
- //获得和属性对应的getXXX()方法的名字
- String getMethodName = "get" + firstLetter + fieldName.substring(1);
- //获得和属性对应的setXXX()方法的名字
- String setMethodName = "set" + firstLetter + fieldName.substring(1);
- //获得和属性对应的getXXX()方法
- Method getMethod = classType.getMethod(getMethodName, new Class[]{});
- //获得和属性对应的setXXX()方法
- Method setMethod = classType.getMethod(setMethodName, new Class[]{field.getType()});
- //调用原对象的getXXX()方法
- Object value = getMethod.invoke(object, new Object[]{});
- System.out.println(fieldName + ":" + value);
- //调用复制对象的setXXX()方法
- setMethod.invoke(objectCopy, new Object[]{value});
- }
- return objectCopy;
- }
- public static void main(String[] args) throws IllegalArgumentException, SecurityException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
- Customer1 customer = new Customer1("tom",21);
- customer.setId(new Long(1));
- Customer1 customerCopy = (Customer1) new ReflectTester().copy(customer);
- System.out.println("Copy information:" + customerCopy.getName()+ ""
- +customerCopy.getAge());
- }
- }
- class Customer1 implements Serializable {
- private Long id;
- private String name;
- private int age;
- public Customer1() {}
- public Customer1(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;
- }
- }
代码中有一个Customer1的JavaBean,通过反射复制了一个Customer1类的对象,为customerCopy,程序中的new Class[] { }是一种快捷方式,获得方法的引用。[]中用来放参数,{}里面可以放置方法的返回类型。new Class[] { }相当于new class("构造函数参数").newinstance.
//调用原对象的getXXX()方法
Object value = getMethod.invoke(object, new Object[]{});
System.out.println(fieldName + ":" + value);
用来获得特定对象的特定方法。