??我們看一下下面的代碼:
package com.example.Reflect;
import java.util.ArrayList;
public class MethodDemo2 {
public static void main(String[] args) {
ArrayList<Integer> list1 = new ArrayList<Integer>();
ArrayList<String> list2 = new ArrayList<String>();
Class c1 = list1.getClass();
Class c2 = list2.getClass();
System.out.println(c1 == c2);
}
}
??上面的代碼是一個(gè)簡單集合的使用随常,其中l(wèi)ist1的泛型是Integer,表示只能向里面加Integer的對(duì)象慢洋,list2的泛型是String垮抗,表示只能向里面加String的對(duì)象。而我們會(huì)發(fā)現(xiàn)c1 == c2卻為true惩妇,表示說反射的操作都是編譯之后的操作株汉,編譯之后集合的泛型是去泛型化,也就是在運(yùn)行的時(shí)候集合是沒有泛型的歌殃。這時(shí)候我們可以得到一個(gè)結(jié)論:Java中集合的泛型郎逃,是防止錯(cuò)誤輸入的,只在編譯階段有效挺份,繞過編譯就無效了褒翰。
??我們可以通過方法的反射來操作,繞過編譯
try {
System.out.println(list1.size());
Method method = c1.getMethod("add", Object.class);
method.invoke(list1, "12234");
System.out.println(list1.size());
} catch (NoSuchMethodException | SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}