Java反射绕过泛型检查

在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");
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  •   在Effective中讲到泛型之处提到了一个概念,类型擦除器,这是什么呢?接下来我们跟随这篇文章探索类型擦除的...
    凌云_00阅读 2,174评论 0 8
  • “泛型”这个术语的意思是:"适用于许多许多的类型”。如何做到这一点呢,正是通过解耦类或方法与所使用的类型之间的约束...
    王侦阅读 1,189评论 0 0
  • 以下内容不不不涉及剧透,放心阅读~ 话说《正义联盟》的时间线紧接《蝙蝠侠大战超人》结尾,超人战死,人民群众纷纷沉寂...
    格物邦阅读 1,013评论 0 2
  • 那百度上的seo名词解释,我觉得没必要在这里说了。就讲讲我对seo最不官方的个人理解吧,seo:就是通过符合自身产...
    f8bffb90462d阅读 1,008评论 0 1
  • 窗外的雪越飘越大,早晨起床后还沉浸在昨晚回家了的梦境中,写下这篇想回家过年的文章,越在这个时候,回家的心越来越急切...
    丢丢吧阅读 749评论 6 9