思路分析 如何经过反射 给 bean entity 对象 的List 集合属性赋值?

其实 这块 你们 去 看 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

相关文章
相关标签/搜索