反射獲取對象屬性含list

前言,在大型項目中不多會直接使用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