思路分析 如何經過反射 給 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

相關文章
相關標籤/搜索