最近做一个东西,需要拷贝一个对象,而且父类属性也需要拷贝。.很多人可能会说直接引用待拷贝的对象就可以了。但是这个方法支持了使用子类引用指象父类引用。以下是代码:/** Java代码:
1. /** 将sourceObj的属性拷贝到targetObj 2. * @param sourceObj 3. * @param targetObj 4. * @param clazz 从哪一个类开始(比如sourceObj对象层级为:Object->User->ChineseUser->ChineseMan->ChineseChongQingMan) 5. * 如果需要从ChineseUser开始复制,clazz就指定为ChineseUser.class 6. */ 7. public static void cpoyObjAttr(Object sourceObj,Object targetObj, Class<?> clazz)throws Exception{ 8. if(sourceObj==null || targetObj==null){ 9. throw new Exception("源对象和目标对象不能为null"); 10. } 11. Field[] fields=clazz.getDeclaredFields(); 12. for(int i = 0; i < fields.length; i++){ 13. fields.setAccessible(true); 14. Object sourceValue=fields.get(sourceObj); 15. fields.set(targetObj,sourceValue ); 16. } 17. if(clazz.getSuperclass()==Object.class){ 18. return; 19. } 20. cpoyObjAttr(sourceObj,targetObj,clazz.getSuperclass()); 21. 22. } 以下是单元测试: Java代码:
1. @Test 2. public void cpoyObjAttrTtest(){ 3. ChineseMan chineseMan=new ChineseMan(); 4. chineseMan.setUserName("程序员"); 5. chineseMan.setCat(new Cat("tom")); 6. 7. try { 8. ChineseManExtend chineseManExtend=new ChineseManExtend(); 9. ObjectTool.cpoyObjAttr(chineseMan, chineseManExtend, chineseMan.getClass()); 10. System.out.println(chineseManExtend.getUserName()); 11. System.out.println(chineseManExtend.getCat().getCatName()); 12. 13. } catch (Exception e) { 14. // TODO Auto-generated catch block 15. e.printStackTrace(); 16. } 17. }
QQ 744437114
疯狂软件官网:http://www.fkjava.org
疯狂java视频 android视频:http://www.fkjava.org/video.html
|