反射的操作都是编译之后的操作(即运行时刻)
编译之后集合的泛型是去泛型化的
* Java中集合的泛型,是防止错误输入的,只在编译阶段有效,
* 绕过编译就无效了
也就是说,我们可以通过方法的反射来操作,绕过编译,向智能添加String类型的集合添加int类型的数据也可以。
举例:
package com.imooc.reflect;
import java.lang.reflect.Method;
import java.util.ArrayList;
public class 反射和泛型 {
public static void main(String[] args) {
ArrayList list = new ArrayList();
ArrayList<String> list2 = new ArrayList<String>();
list2.add("Hello");
// list2.add(20);//错误
Class class1 = list.getClass();
Class class2 = list2.getClass();
System.out.println("class1==class2??"+(class1==class2));
//反射的操作都是编译之后的操作
/*class1==class2的比较结果返回true说明集合的泛型是去泛型话的
* 也就是说集合编译之后没有了泛型
* Java中集合的泛型,是防止错误输入的,绕过编译就无效了
*/
try {
Method method = class1.getMethod("add", Object.class);
method.invoke(list2, 20);//反射后可以加进去int型的
System.out.println(list2.size());
//绕过编译操作就绕过了泛型
System.out.println("list2:"+list2);
//
// //那么就不能用forEach抛异常了
// for(String string:list2){
// System.out.println(string);
// }
} catch (Exception e) {
e.printStackTrace();
}
}
}