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

  • 相关阅读:
    关于 java jdk 环境变量的配置
    Jquery ajax 参数 详解
    关于百度world 编辑器改变上传图片的保存路径图片不显示的问题
    asp.net 中日期的格式化显示的方法
    sql server数据库中 smallint, int ,bigint ,tinyint的区别与长度
    create sequence
    INSERT高级应用
    TRUNCATE TABLE
    CREATE DATABASE LINK
    bulk
  • 原文地址:https://www.cnblogs.com/Java-biao/p/12590897.html
Copyright © 2020-2023  润新知