1 实体类(你需要进行克隆的源对象 )
public class Person {
private int id;
private String name;
public Person() {
super();
// TODO Auto-generated constructor stub
}
public Person(int id, String name) {
super();
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2.对上面对象进行克隆
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* 通过反射实现对象的克隆
* @author Administrator
*
*/
public class CopyObject {
/**
* 实现对象克隆
* @param person
* @throws Exception
*/
public Object copyObj (Person person) throws Exception{
Object obj=null;//克隆对象
//获取类
Class c=person.getClass();
//调用构造方法,创建对象
obj =c.getConstructor(new Class[]{}).newInstance(new Object[]{});
//获取源对象的属性
Field[] fs=c.getDeclaredFields(); //id name
for(int i=0;i<fs.length;i++){
//组装get方法: 1.get 2.属性第一个字母大写 3.除第一个字母其余相同
//获取某个属性
Field f= fs[i];
//获取属性名
String fieldName =f.getName();
//第一个字母大写
String firstLetter = fieldName.substring(0,1).toUpperCase();
//组装方法:getId()
String getMethodName ="get"+firstLetter+fieldName.substring(1,fieldName.length());
//组装方法:set
String setMethodName ="set"+firstLetter+fieldName.substring(1,fieldName.length());
//获取源对象指定的方法
Method getMethod =c.getDeclaredMethod(getMethodName,new Class[]{});
Method setMethod =c.getDeclaredMethod(setMethodName,new Class[]{f.getType()});//f.getType()属性的类型
//执行方法
Object value= getMethod.invoke(person, new Object[]{});//获取值
setMethod.invoke(obj, value);
}
return obj;
}
public static void main(String[] args) throws Exception{
//创建源对象
Person p=new Person(1,"张三");
System.out.println("源对象数据:"+p.getId()+"\t"+p.getName());
//生成克隆对象
CopyObject co=new CopyObject();
Person person=(Person)co.copyObj(p);
System.out.println("克隆对象数据:"+person.getId()+"\t"+person.getName());
}
}