前言,在大型项目中不多会直接使用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));
}
}
}
}
}
}
}
http://www.javashuo.com/article/p-wcihviuo-ga.html