zoukankan      html  css  js  c++  java
  • 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);
    	}
    }
    

    测试结果如下:

    Java新手,若有错误,欢迎指正!

  • 相关阅读:
    System.Collections.Generic.KeyValuePair.cs
    物理-三菱镜-三菱镜效应:三菱镜效应 百科
    物理-光学仪器-三菱镜:三菱镜 百科
    公司-IT-Mercari:Mercari 百科
    公司-IT-SanSan:SanSan
    汉语-词汇:资源
    Inside GDALAllRegister之三: 注册指定驱动
    android-文字的处理-随心
    source insight中{}自动缩进的调整
    IOS效率提升工具
  • 原文地址:https://www.cnblogs.com/Java-biao/p/12590897.html
Copyright © 2011-2022 走看看