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

一、需求描述

现有一个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);
	}
}

测试结果如下:

猜你喜欢

转载自www.cnblogs.com/Java-biao/p/12590897.html