Java-通过反射越过泛型检查

烈酒焚心 提交于 2020-03-29 11:00:09

一、需求描述

现有一个ArrayList array= new ArrayList();如何在array中添加String类型数据???

二、思考

我们知道在集合类中一旦指定了泛型的类型,则只能在该集合中用该类型。但是我们可以利用反射机制来越过泛型检查。比如说利用反射机制获取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新手,若有错误,欢迎指正!

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!