Java反射——通过反射绕过集合泛型的限制
2018-05-06 本文已影响9人
depers
直接上代码:
public class MethodDome2 {
public static void main(String[] args) {
ArrayList list = new ArrayList();
ArrayList<String> list2 = new ArrayList<>();
list2.add("hello");
//list2.add(20); // error
Class c1 = list.getClass();
Class c2 = list2.getClass();
//反射的操作都是编译之后的操作
System.out.println(c1 == c2); // true
/*
* c1==c2结果返回true说明编译之后集合的泛型是去泛型化的
* Java中集合的泛型,是防止错误输入的,只在编译阶段有效,绕过编译就无效了
* 验证:我们可以通过方法的反射来操作,绕过编译
*/
try {
// 通过反射就可以绕过集合泛型的限制
Method method = c2.getMethod("add", Object.class);
method.invoke(list2, 20);
System.out.println(list2.size());
System.out.println(list2);
} catch (Exception e) {
e.printStackTrace();
}
}
}
“去泛型化”就是指忽略了泛型在集合中的作用。在集合中泛型主要是来防止错误输入的,只在编译阶段有效,而通过反射我们就可以绕过集合泛型的限制可以随意的添加。
输出结果:
2
[hello, 20]