最近做一个东西,需要拷贝一个对象,而且父类属性也需要拷贝。.很多人可能会说直接引用待拷贝的对象就可以了。但是这个方法支持了使用子类引用指象父类引用。以下是代码:/**
/** 将sourceObj的属性拷贝到targetObj
* @param sourceObj
* @param targetObj
* @param clazz 从哪一个类开始(比如sourceObj对象层级为:Object->User->ChineseUser->ChineseMan->ChineseChongQingMan)
* 如果需要从ChineseUser开始复制,clazz就指定为ChineseUser.class
*/
public static void cpoyObjAttr(Object sourceObj,Object targetObj, Class<?> clazz)throws Exception{
if(sourceObj==null || targetObj==null){
throw new Exception("源对象和目标对象不能为null");
}
Field[] fields=clazz.getDeclaredFields();
for(int i = 0; i < fields.length; i++){
fields[i].setAccessible(true);
Object sourceValue=fields[i].get(sourceObj);
fields[i].set(targetObj,sourceValue );
}
if(clazz.getSuperclass()==Object.class){
return;
}
cpoyObjAttr(sourceObj,targetObj,clazz.getSuperclass());
}
以下是单元测试:
@Test
public void cpoyObjAttrTtest(){
ChineseMan chineseMan=new ChineseMan();
chineseMan.setUserName("程序员");
chineseMan.setCat(new Cat("tom"));
try {
ChineseManExtend chineseManExtend=new ChineseManExtend();
ObjectTool.cpoyObjAttr(chineseMan, chineseManExtend, chineseMan.getClass());
System.out.println(chineseManExtend.getUserName());
System.out.println(chineseManExtend.getCat().getCatName());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}