/** * 对象的属性值拷贝 * <p> * 将source对象中的属性值赋值到target对象中的属性,属性名一样,类型一样 * <p> * example: * <p> * source: * <p> * String name; * String address; * Integer age; * Date birthday; * <p> * target: * String name; * String address; * String email * <p> * 结果: source name, address -> target name, address * * @param source * @param target */
思路:三步走,
第一步:获取source和target的全部属性,放入List集合中(为什么要放入List集合中,为了偷懒而已,大可以不放就是多写一层循环而已);
第二步:比较两个类中属性名是否相等,相等的话,执行第三步,不相等,继续遍历,直到遍历结束;
第三步:判断属性的类型是否相同,相同赋值,不相同继续遍历,直到遍历结束
代码如下:
public static void copy(Object s, Object t) { //TODO List<String> list_s = new ArrayList<>(); List<String> list_t = new ArrayList<>(); //获取s的Class对象 Class clss = s.getClass(); //获取t的Class对象 Class clst = t.getClass(); //获取s中所有属性,并加入到集合list_s中 Field[] fields = clss.getDeclaredFields(); for(Field ff : fields){ list_s.add(ff.getName()); } //获取t中所有属性,并加入到集合list_t中 Field[] fieldt = clst.getDeclaredFields(); for(Field ff : fieldt){ list_t.add(ff.getName()); } //遍历list_t集合,在list_s集合中查找是否含有t的属性,包含判断属性类型是否相同,相同赋值 for(String ss : list_t){ if(list_s.contains(ss)&&isEqualFieldType(s,t,ss)){ sCopyt(s,t,ss); } } }
//判断二者属性类型是否相同 public static boolean isEqualFieldType(Object o1,Object o2,String s){ Class cls1 = o1.getClass(); Class cls2 = o2.getClass(); try { Field f1 = cls1.getDeclaredField(s); Field f2 = cls2.getDeclaredField(s); if(f1.getType().getName().equals(f2.getType().getName())){ return true; } } catch (NoSuchFieldException e) { e.printStackTrace(); } return false; }
//将s中的属性值赋给t的属性值 public static void sCopyt(Object o1,Object o2,String s){ Class cls1 = o1.getClass(); Class cls2 = o2.getClass(); try { //获取对应的属性对象 Field f1 = cls1.getDeclaredField(s); Field f2 = cls2.getDeclaredField(s); //设置可见性 f1.setAccessible(true); f2.setAccessible(true); //利用get和set方法进行赋值 f2.set(o2,f1.get(o1)); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } }
原文地址:https://www.cnblogs.com/du001011/p/10778133.html
时间: 2024-07-31 15:56:51