反射_越过泛型检查
练习:有一个ArrayList
反射_越过泛型检查的练习
xxxxxxxxxx
package ch27;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
public class a_12_1测试 {
public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
//创建集合
ArrayList<Integer> array = new ArrayList<Integer>();
//-----------------------------------------------------------------------------------------------------
//以前我们的写法,能否把字符串数据添加到Integer类型的集合呢
/*array.add(10);
array.add(20);
array.add("hello");*/
//上面那行当我们往集合里添加字符串数据时,就会报红线编译错误。显然不能实现我们这节课的要求。先注释,需要自行解开
//-----------------------------------------------------------------------------------------------------
//使用现在我们学的反射来写,如下
Class<? extends ArrayList> c = array.getClass();//得到ArrayList集合的Class对象
Method m = c.getMethod("add", Object.class);
//原理:反射可以越过泛型检查,从而获取到原始的方法所需要的参数类型Object.class,最后调用原始的方法参数类型就可以往非String类型的集合中添加字符串
m.invoke(array,"hello");
m.invoke(array,"world");
m.invoke(array,"java");
System.out.println(array);//输出集合[hello, world, java]
}
}