package com.zj.reflect;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* 功能:用反射实现拷贝对象
* @author zhengjiong
* time:2011-9-17 19:37:46
*/
public class ReflectTest4
{
public static void main(String[] args) throws Exception
{
ReflectTest4 rf = new ReflectTest4();
People p1 = new People("zhangsn", 15);
//执行拷贝
People p2 = (People)rf.copy(p1);
System.out.println(p2.getName() + " , " + p2.getAge());
}
private Object copy(Object p1) throws Exception
{
Class<?> classType = p1.getClass();
//获得所有属性
Field[] fields = classType.getDeclaredFields();
//获得People的实例
Object p2 = classType.newInstance();
for(int i = 0; i < fields.length; i++){
String methodName = fields[i].getName();
String firstLetter = methodName.substring(0, 1).toUpperCase();
//获得set,get方法名
String getMethodName = "get" + firstLetter + methodName.substring(1);
String setMethodName = "set" + firstLetter + methodName.substring(1);
//获得People类每个属性的set,get方法
Method getMethod = classType.getMethod(getMethodName, new Class<?>[]{});
Method setMethod = classType.getMethod(setMethodName, new Class<?>[]{fields[i].getType()});
//调用p1对象的get方法获得值
Object value = getMethod.invoke(p1, new Object[]{});
//把获得的值传给p2的set方法
setMethod.invoke(p2, new Object[]{value});
}
return p2;
}
}
class People{
private String name;
private int age;
public People(){}
public People(String name, int age){
this.name = name;
this.age = age;
}
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;
}
}