通过反射实现对象的克隆

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());
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值