1. 程式人生 > >將source類中的屬性值賦給target類中對應的屬性

將source類中的屬性值賦給target類中對應的屬性

兩個 結果 catch date 執行 () print access 是否

/**
     * 對象的屬性值拷貝
     * <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(); } }

將source類中的屬性值賦給target類中對應的屬性