一、需求描述
现有一个ArrayList
二、思考
我们知道在集合类中一旦指定了泛型的类型,则只能在该集合中用该类型。但是我们可以利用反射机制来越过泛型检查。比如说利用反射机制获取ArrayList中的add()方法,再调用add方法时,就会越过泛型检查。通过反编译我们能看到这一现象。
现有如下代码,创建ArrayList时使用了泛型。
public class Test {
public static void main(String[] args) throws Exception {
ArrayList<Integer> array = new ArrayList<Integer>();
}
}
利用反编译查看Class文件,就会发现此时创建ArrayList时并没有增加泛型。
这是因为泛型检查是在编译时期进行的,也就是说编译后的add()方法其实和没有指定泛型的add()方法是一致的,都是没有进行泛型检查的。
所以通过反射获取ArrayList的Class文件对象中的add()方法,在调用该add()方法时是不用泛型检查的。
三、需求实现
现在使用反射来实现这一需求。
代码如下:
public class Test {
public static void main(String[] args) throws Exception {
ArrayList<Integer> array = new ArrayList<Integer>();
array.add(18);
Class c = array.getClass();
Method m = c.getDeclaredMethod("add", Object.class);
m.invoke(array, "Hello");
System.out.println(array);
}
}
测试结果如下:
Java新手,若有错误,欢迎指正!