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新手,若有错误,欢迎指正!

  • 相关阅读:
    ios10 获取idfa的坑
    iOS 获取手机sim卡的运营商(移动,电信,联通) 相关信息
    iOS获取手机IP地址
    UIScrollView 与 touchesBegan 冲突解决方法
    32位与64位基础
    MySQL数据库基础_表&简单查询
    MySQL数据库基础
    Java_File、递归
    Java_lambda表达式
    Java线程锁,等待唤醒和线程池
  • 原文地址:https://www.cnblogs.com/Java-biao/p/12590897.html
Copyright © 2011-2022 走看看