其实 这块 大家 去 看 springmvc 源码 肯定可以找到实现办法。 因为 spirngmvc 的方法 是可以 为 对象 参数里面的 list 属性赋值的。 我也没有看 具体的 mvc 源码实现,我这里只是 写一个 简单的思路。 通过我的这个方式肯定是可以的实现的。不知道还有没有其他实现的方式。 因为我百度了好久都没有找到。。。 都是百度 到 简单的反射, 没有涉及到集合的,或者 已经知道集合的类型了。。。
上例子代码
public class User {
public String teString;
private Integer age;
private List<Car> cars;
就是 要通过 反射给 cars 这个 List 集合赋值,在不知道 cars 是什么类型集合的情况下。
测试使用的 方法
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 的访问 方法, 考虑怎么实现它,
比如 User user 作为参数, 怎么 是给 user 里面的 list<car> 赋值进去的?
下面是我的小测试
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里面的 >>>>>");
}
}
}
}
}
其实关键就是 这里
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()
的输出内容是 : 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