天天看點

Java反射機制之集合泛型的本質

package com.imooc.reflect;

import java.lang.reflect.Method;
import java.util.ArrayList;

public class MethodDemo4 {
	public static void main(String[] args) {
		ArrayList list = new ArrayList();
		
		ArrayList<String> list1 = new ArrayList<String>();
		list1.add("hello");
		//list1.add(20);錯誤的
		Class c1 = list.getClass();
		Class c2 = list1.getClass();
		System.out.println(c1 == c2);
		//反射的操作都是編譯之後的操作
		
		/*
		 * c1==c2結果傳回true說明編譯之後集合的泛型是去泛型化的
		 * Java中集合的泛型,是防止錯誤輸入的,隻在編譯階段有效,
		 * 繞過編譯就無效了
		 * 驗證:我們可以通過方法的反射來操作,繞過編譯
		 */
		try {
			Method m = c2.getMethod("add", Object.class);
			m.invoke(list1, 20);//繞過編譯操作就繞過了泛型
			System.out.println(list1.size());
			System.out.println(list1);
			/*for (String string : list1) {
				System.out.println(string);
			}*///現在不能這樣周遊
		} catch (Exception e) {
		  e.printStackTrace();
		}
	}

}