將source類中的屬性值賦給target類中對應的屬性
阿新 • • 發佈:2019-04-27
兩個 結果 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類中對應的屬性