先看代码吧:
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);
用来获得特定对象的特定方法。