其實 這塊 你們 去 看 springmvc 源碼 確定能夠找到實現辦法。 由於 spirngmvc 的方法 是能夠 爲 對象 參數裏面的 list 屬性賦值的。 我也沒有看 具體的 mvc 源碼實現,我這裏只是 寫一個 簡單的思路。 經過個人這個方式確定是能夠的實現的。不知道還有沒有其餘實現的方式。 由於我百度了很久都沒有找到。。。 都是百度 到 簡單的反射, 沒有涉及到集合的,或者 已經知道集合的類型了。。。html
上例子代碼java
public class User { public String teString; private Integer age; private List<Car> cars;
就是 要經過 反射給 cars 這個 List 集合賦值,在不知道 cars 是什麼類型集合的狀況下。spring
測試使用的 方法數組
public class MethodTo { public void allCars(User user, Car car, List<Car> cars, ArrayList<Car> alCars, Long a, String[] strs, String str, Long[] numarr, Car[] carArray) { System.out.println("多少車" + cars.size()); } }
我這裏是 模擬spirngmvc 的訪問 方法, 考慮怎麼實現它, mvc
好比 User user 做爲參數, 怎麼 是給 user 裏面的 list<car> 賦值進去的?測試
下面是個人小測試 code
public class Test { public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException { System.out.println(MethodTo.class.getName()); System.out.println("方法個數" + MethodTo.class.getMethods().length); for (Method mt : MethodTo.class.getMethods()) { if (mt.getName() != "allCars" && mt.getName() != "testStr") { continue; } // 1.8 纔有的 for (Parameter p : mt.getParameters()) { System.out.println(p.getName()); } System.out.println("==============="); System.out.println("方法名稱:" + mt.getName()); System.out.println("方法參數的數量:" + mt.getParameterCount()); for (Class<?> clz : mt.getParameterTypes()) { System.out.println(clz.getName()); if (clz.isArray()) { System.out.println("數組類>>>" + clz.getName()); System.out.println(clz.getTypeName()); System.out.println(clz.getCanonicalName()); System.out.println(clz.getSimpleName()); System.out.println(clz.getComponentType()); System.out.println("數組類>>>" + clz.getName()); } if (clz.getName().equals(User.class.getName())) { System.out.println(">>>>>>>>>>>>>>>"); for (Field f : clz.getFields()) { System.out.println(f.getName() + "==" + f.getType()); } System.out.println(">>>>>>>>>>>>>>>"); System.out.println("###############"); for (Field f : clz.getDeclaredFields()) { // 能夠獲取 私有的 字段屬性 if (f.getGenericType().getTypeName().equals("java.util.List<com.mytest.reflect.Car>")) { System.out.println(f.getName() + "==" + f.getType()); System.out.println(f.getGenericType().getTypeName()); // 能夠經過 截取出 f.getGenericType().getTypeName() : com.mytest.reflect.Car 就知道集合類型的 Class cc = Class.forName("com.mytest.reflect.Car"); for (Field fc : cc.getDeclaredFields()) { System.out.println(fc.getName()); } Type type = f.getGenericType(); } } System.out.println("###############"); } if (clz.getName() == "java.util.List") { // list // List list = (List) clz.newInstance(); // list = new ArrayList<>(); // 經過list 賦值給 明細表 字段裏面的內容? System.out.println("list裏面的 >>>>>"); System.out.println(clz.getTypeName()); // System.out.println(clz.getDeclaredFields().length); // System.out.println(clz.getFields().length); // System.out.println(clz.getComponentType().getName()); // System.out.println(clz.getDeclaredClasses()); // System.out.println(clz.getGenericSuperclass().toString()); // System.out.println(clz.getSuperclass().toString()); System.out.println(clz.getTypeParameters()[0].getTypeName()); System.out.println("list裏面的 >>>>>"); } } } } }
其實關鍵就是 這裏 htm
if (f.getGenericType().getTypeName().equals("java.util.List<com.mytest.reflect.Car>")) { System.out.println(f.getName() + "==" + f.getType()); System.out.println(f.getGenericType().getTypeName()); // 能夠經過 截取出 f.getGenericType().getTypeName() : com.mytest.reflect.Car 就知道集合類型的 Class cc = Class.forName("com.mytest.reflect.Car"); for (Field fc : cc.getDeclaredFields()) { System.out.println(fc.getName()); } Type type = f.getGenericType(); }
由於 經過控制檯能夠看到對象
f.getGenericType().getTypeName() blog
的輸出內容是 : java.util.List<com.mytest.reflect.Car>
就能夠知道 這個對象裏面 有 一個 list 集合屬性, 類型是
com.mytest.reflect.Car
這下子 就能夠 經過反射 com.mytest.reflect.Car
爲 car 對象賦值了, 而後 經過 反射 給 這個集合放入 car 對象了。。
3重方式, 先是 反射方法,獲取 參數, User ,
反射 user 或者 List<car> , 反射 car
就能夠 了。。。
具體剩下的實現思路 我以爲你們 真的要 寫代碼用的話,確定百度不少了。
我就懶得寫了,我又目前沒用到。。。
能夠參考 https://www.cnblogs.com/tatame/articles/2417213.html