美文网首页
Java反射绕过泛型检查

Java反射绕过泛型检查

作者: 王魔王 | 来源:发表于2018-12-03 22:02 被阅读0次

在java的泛型中,实际上只是编译器认识泛型,而虚拟机是不认识泛型的。简单来讲,在运行时,所有的泛型都是object

泛型检查存在擦除泛型的动作(即编译器认识泛型,而虚拟机不认识泛型),真正运行时,泛型位置仍然使用的是object

       //指定list的泛型为Integer
        ArrayList<Integer> list = new ArrayList<>();
        //Integer类型的数据可以正常添加
        list.add(1);
        //如果添加String类型的数据,则编译器报错,无法通过编译
        //list.add("a");
        
        //通过反射绕过泛型检查,即泛型擦除
        Class<ArrayList> listClass = ArrayList.class;
        Method addMethod = listClass.getMethod("add", Object.class);
        //编译器不再报错,程序也可以正常执行
        addMethod.invoke(list, "a");

相关文章

  • Java反射绕过泛型检查

    在java的泛型中,实际上只是编译器认识泛型,而虚拟机是不认识泛型的。简单来讲,在运行时,所有的泛型都是objec...

  • Java泛型——利用反射越过泛型检查

    上一篇提到泛型基本是不可具化的,因为在运行期会将类型擦除。我们也知道泛型擦出的目的主要是为了兼容原生态类型的代码,...

  • Java反射——通过反射绕过集合泛型的限制​

    直接上代码: “去泛型化”就是指忽略了泛型在集合中的作用。在集合中泛型主要是来防止错误输入的,只在编译阶段有效,而...

  • 【Java】【反射】泛型反射

    泛型反射 在运行时,泛型是无效的,所以可以通过反射在运行时将其他类型变量添加到集合,而不需要考虑泛型

  • 2021校招 复习总结

    笔记导航: JAVA: 泛型 反射和动态代理 注解 JAVA多线程 ReentrantLock,Volatile,...

  • 反射

    动态编译与静态编译 反射 一个注意的地方Java中集合的泛型,是防止错误输入的,只在编译阶段有效,绕过编译到了运行...

  • Java反射 - 泛型

    使用Java泛型通常分为两种不同的情况: 声明一个类/接口是可参数化的。 使用可参数化的类。当你写一个类或接口时,...

  • java 泛型 反射

    通过类上指定的泛型 测试类 说明 1、new TestCall2 () { }是新建了个子类 其类型class ...

  • 2019-02-19 通过反射来看泛型的本质

    反射是在运行时编译后操作,而泛型是在编译时生效,泛型是为了防止错误的类型输入,在编译后泛型并不存在。当绕过编译用反...

  • 泛型:类型擦除

    Java 语言引入泛型是为了在编译时提供更严格的类型检查,并支持泛型编程。 为了实现泛型,Java编译器将类型擦除...

网友评论

      本文标题:Java反射绕过泛型检查

      本文链接:https://www.haomeiwen.com/subject/jbnucqtx.html