前言,在大型項目中不多會直接使用form提交表單到後臺直接使用的。因爲存在多個系統的相互調用,爲了兼容和解耦,一般會使用xml或json傳送數據。在xml轉到service中的pojo類的時候通常會使用到反射,在轉換list屬性的時候,不能直接使用相似targetField=sourceField的方式,會改變目標類中引用的地址,致使service中沒法引用到pojo類。因此要獲取list中的對象,而後獲取屬性。json
爲了複用,通常使用Object做爲參數,代碼以下:測試
public class Reflact {
public static void main(String[] args) throws Exception {orm
//測試方法
List<Room> rooms = new ArrayList<Room>();
rooms.add(new Room(1,"大浪",100.0));
rooms.add(new Room(2,"xiao浪",101.0));
User u =new User("zhangsan", 18, rooms);
doWithR(u);
}
static void doWithR(Object obj) throws Exception{
Field[] fields = obj.getClass().getDeclaredFields();
for (Field f : fields) {
if(!f.isAccessible()){
f.setAccessible(true);//賦權使用,不然private類型是沒法操做的
}
if(List.class.isAssignableFrom(f.getType())){//判斷是否爲list
Type t = f.getGenericType();
if(t instanceof ParameterizedType){
//ParameterizedType pt = (ParameterizedType)t;
//Class clz = (Class)pt.getActualTypeArguments()[0];
Class clazz = f.get(obj).getClass();//獲取對象list屬性的class
Method m = clazz.getDeclaredMethod("size");//獲取list屬性的size方法
int size = (Integer)m.invoke(f.get(obj));//調用size方法
for(int i = 0; i < size; i++){//根據size大小循環
Method getM = clazz.getDeclaredMethod("get", int.class);//獲取list屬性的get方法
//System.out.println(getM);
Object u = getM.invoke(f.get(obj), i);//調用get方法獲取list中的對象
doWithR(u);//若list中還有list能夠遞歸調用
//測試是否能夠獲取到list中對象的屬性的值
Field[] uf = u.getClass().getDeclaredFields();
for (Field fu : uf) {
if(!fu.isAccessible())
fu.setAccessible(true);
System.out.println(fu.get(u));
}
}
}
}
}
}
}xml