最近做一个东西,需要拷贝一个对象,而且父类属性也需要拷贝。.很多人可能会说直接引用待拷贝的对象就可以了。但是这个方法支持了使用子类引用指象父类引用。以下是代码:/**
- /** 将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());
- }
/** 将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();
- }
- }