黑马程序员技术交流社区

标题: 为什么反射还能获取泛型的类型信息? [打印本页]

作者: straw    时间: 2013-8-18 01:29
标题: 为什么反射还能获取泛型的类型信息?
在张老师的高新技术中讲到泛型,泛型的定义是给编译器知道的,程序能不能通过是编译器一句话的事情.
程序在被编译成可执行文件后就去掉了泛型.然后可以通过反射技术来绕过泛型对参数化了的集合对象进行其他数据类型存储.
照这样说程序的字节码中已经没有了泛型,那么使用反射当然也不能获取到泛型的类型信息了.可是实际中是可以获取到的.
首先通过Field对象的getGenericType()方法获取字段声明类型的Type对象.
再将Type强制转换成已实现该接口的参数化类型ParameterizedType对象.
最后通过参数化类型ParameterizedType的getActrualTypeArguments()返回实际类型参数的数组对象.

本人迷惑为什么泛型定义只是跟编译器作用?既然如此为什么还能用反射获取到泛型的类型对象?
既然都能用反射获取到泛型的类型对象,那为什么有能还能通过反射来绕开泛型对集合进行其他数据类型存储,虚拟机也没有报异常?


作者: 许云龙    时间: 2013-8-18 07:39
哈哈,这也是我想问的问题

作者: straw    时间: 2013-8-18 22:33
许云龙 发表于 2013-8-18 07:39
哈哈,这也是我想问的问题

       java中的泛型在jdk1.5之后才加进去的,功能基本都是模仿c++中泛型,但是没有c++的泛型那样强大到可在程序执行时都还有泛型功能.这是跟起初java
的虚拟机JVM的设计有关,如果要将泛型功能全部添加到JVM中也可以,但是工程量非常大,sun公司不会因为一个泛型的追求而去几乎翻新一个JVM.所以就放弃了.但是泛型在java中还是有一定的作用的,所以sun公司就在编译器中实现了一个可以擦出泛型的方法.这么一来java中泛型的生命周期就只能在源代码到编译期了.这就为什么会出现在字节码中可以获取到泛型的Type对象,而又可以绕过泛型对参数化了的集合进行其他数据类型存储的现象.

       那为什么sun公司还要提供我们在字节码中获取到泛型的Type对象呢?
       我想这是sun公司为了伱补java泛型的不完美吧!让我们在程序中可以手动实现一个方法去检测接受的数据类型是否就是源代码中定义的泛型类型,如果
不是那么就做相应处理.这样使得程序执行起来更安全,不会因为项目在部署后因传入其他数据类型而照成程序异常等结果发生.

作者: 神之梦    时间: 2013-8-19 00:23
{:soso_e179:}
作者: straw    时间: 2013-8-19 01:27
神之梦 发表于 2013-8-19 00:23

传说中的神之梦都是在很晚时候才出没啊!{:soso_e128:}

作者: 神之梦    时间: 2013-8-20 00:24
straw 发表于 2013-8-19 01:27
传说中的神之梦都是在很晚时候才出没啊!

我不是传说中的,要说传说中也是一只小菜鸟,乘你们都睡了就来给你加分了{:soso_e113:}

作者: straw    时间: 2013-8-20 01:00
神之梦 发表于 2013-8-20 00:24
我不是传说中的,要说传说中也是一只小菜鸟,乘你们都睡了就来给你加分了
...

太谦虚了!不管怎么说你仍然是我们心目中的神!





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2