前言,在大型项目中很少会直接使用form提交表单到后台直接使用的。由于存在多个系统的相互调用,为了兼容和解耦,通常会使用xml或json传送数据。在xml转到service中的pojo类的时候一般会使用到反射,在转换list属性的时候,不能直接使用类似targetField=sourceField的方式,会改变目标类中引用的地址,导致service中无法引用到pojo类。所以要获取list中的对象,然后获取属性。
为了复用,一般使用Object作为参数,代码如下:
public class Reflact {
public static void main(String[] args) throws Exception {
//测试方法
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));
}
}
}
}
}
}
}