37_泛型的内部原理及更深应用

泛型只是给编译器看的

泛型是提供给javac编译器使用的,可以限定集合中的输入类型,让编译器挡住源程序中的非法输入,编译器编译带来类型说明的集合时会去除掉“类型”信息,是程序运行效率不受影响,对于参数化的泛型类型,getClass()方法的返回值和原始类型完全一样。由于编译生成的字节码会去掉泛型的类型信息,只要能跳过编译器,就可以往某个泛型集合中加入其它类型的数据,例如,用反射得到集合,在调用其add方法即可。

不多说,上代码!

 

/*****用反射绕过泛型,给集合中加入其它类型的数据*****/
        List<Integer> list0=new ArrayList<Integer>();
        list0.getClass().getMethod("add", Object.class).invoke(list0, "ljl");//给Integer类型的集合中加入String类型数据"ljl"
        System.out.println(list0.get(0));//ljl    这是编译器 显示 get方法返回 Integer,实际上里面装的是String
时间: 2024-10-11 00:05:53

37_泛型的内部原理及更深应用的相关文章

java泛型(二)、泛型的内部原理:类型擦除以及类型擦除带来的问题

java泛型(二).泛型的内部原理:类型擦除以及类型擦除带来的问题 参考:java核心技术 一.Java泛型的实现方法:类型擦除 前面已经说了,Java的泛型是伪泛型.为什么说Java的泛型是伪泛型呢?因为,在编译期间,所有的泛型信息都会被擦除掉.正确理解泛型概念的首要前提是理解类型擦出(type erasure). Java中的泛型基本上都是在编译器这个层次来实现的.在生成的Java字节码中是不包含泛型中的类型信息的.使用泛型的时候加上的类型参数,会在编译器在编译的时候去掉.这个过程就称为类型

Java泛型的内部原理设计泛型的好处

分享一些工作的经验:不存在脱离业务的技术.所有新技术都是为了解决一些业务痛点,让特定业务更爽. 当我们掌握足够多的技术,在遇到问题时就可以选择适合的技术进行解决.反之,如果没有技术储备,就会手足无措,又或者说选择一些不太恰当的技术进行解决,最终都会走一些弯路.踩一些坑.走弯路.踩坑固然是所有项目都会遇到的一个问题,一个人走弯路.踩坑也许不是什么大问题,但整个项目走弯路,这个最终苦的还是我们这些技术人员. 技术储备至关重要,不论是团队还是个人.有了足够的技术储备,才可以游刃有余,做到胸有成竹,遇到

泛型的内部原理:类型擦除以及类型擦除带来的问题

参考:java核心技术 一.Java泛型的实现方法:类型擦除 前面已经说了,Java的泛型是伪泛型.为什么说Java的泛型是伪泛型呢?因为,在编译期间,所有的泛型信息都会被擦除掉.正确理解泛型概念的首要前提是理解类型擦出(type erasure). Java中的泛型基本上都是在编译器这个层次来实现的.在生成的Java字节码中是不包含泛型中的类型信息的.使用泛型的时候加上的类型参数,会在编译器在编译的时候去掉.这个过程就称为类型擦除. 如在代码中定义的List<object>和List<

【转载】深入研究Windows内部原理绝对经典的资料

原文:深入研究Windows内部原理绝对经典的资料 另一篇资料:深入研究Windows内部原理系列 (为了方便大家下,我打包了放在一下地址: 1-6:http://download.csdn.net/detail/wangqiulin123456/4601530 7-12:http://download.csdn.net/detail/wangqiulin123456/4601508 13-16:http://download.csdn.net/detail/wangqiulin123456/4

Git详解之九 Git内部原理

来自:http://www.open-open.com/lib/view/open1328070620202.html Git 内部原理 不管你是从前面的章节直接跳到了本章,还是读完了其余各章一直到这,你都将在本章见识 Git 的内部工作原理和实现方式.我个人发现学习这些内容对于理解 Git 的用处和强大是非常重要的,不过也有人认为这些内容对于初学者来说可能难以理解且过于复杂.正因如此我把这部分内容放在最后一章,你在学习过程中可以先阅 读这部分,也可以晚点阅读这部分,这完全取决于你自己. 既然已

[转] 浅谈 ArrayList 内部原理

转自:浅谈 ArrayList 内部原理 System.Collections.ArrayList 就是我们常说的动态数组,也是我们常用的 "数据类型" 之一.在 MSDN 上是这样表述的:使用大小可按需动态增加的数组实现 IList 接口.我来解释一下,就是:一个可以根据需要动态增加使用大小并可按照索引单独访问的对象的非泛型集合.一般人都认为 ArrayList 就是一个 "纯动态" 的数组,与 <数据结构> 中 "链表" 的原理一

JavaScript内部原理实践——真的懂JavaScript吗?(转)

通过翻译了Dmitry A.Soshnikov的关于ECMAScript-262-3 JavaScript内部原理的文章, 从理论角度对JavaScript中部分特性的内部工作机制有了一定的了解.但是,邓爷爷说过:“实践才是检验真理的唯一标准”.所以,我打算通过从内部原理来解释一些经常在笔试或者面试中遇到的关于JavaScript语言层面的题目来进一步学习和掌握JavaScript内部工作原理. 那么,首先就是要去找那些题目,google了一圈终于找到了来自Dmitry Baranovskiy的

Git详解之九:Git内部原理

Git 内部原理 不管你是从前面的章节直接跳到了本章,还是读完了其余各章一直到这,你都将在本章见识 Git 的内部工作原理和实现方式.我个人发现学习这些内容对于理解 Git 的用处和强大是非常重要的,不过也有人认为这些内容对于初学者来说可能难以理解且过于复杂.正因如此我把这部分内容放在最后一章,你在学习过程中可以先阅 读这部分,也可以晚点阅读这部分,这完全取决于你自己.(伯乐在线注:如果你对Git还不了解,建议从本Git系列第一篇文章开始阅读) 既然已经读到这了,就让我们开始吧.首先要弄明白一点

JVM内部原理

JVM内部原理 原文链接:http://blog.jamesdbloom.com/JVMInternals.html 原文作者:James D Bloom 以下为本人翻译,仅用于交流学习,版权归原作者所有,转载注明出处,请不要用于商业用途 [TOC] 这篇文章详细描述了Java虚拟机的内在结构.下面这张图来自<The Java Virtual Machine Specification Java SE 7 Edition>,它展示了一个典型的JVM的主要的内部结构. 接下来的2个部分,将详细介