A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© straw 中级黑马   /  2013-8-18 01:29  /  3564 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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

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

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 赞一个!

查看全部评分

6 个回复

倒序浏览
哈哈,这也是我想问的问题
回复 使用道具 举报
许云龙 发表于 2013-8-18 07:39
哈哈,这也是我想问的问题

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

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

传说中的神之梦都是在很晚时候才出没啊!{:soso_e128:}
回复 使用道具 举报
straw 发表于 2013-8-19 01:27
传说中的神之梦都是在很晚时候才出没啊!

我不是传说中的,要说传说中也是一只小菜鸟,乘你们都睡了就来给你加分了{:soso_e113:}
回复 使用道具 举报
straw 中级黑马 2013-8-20 01:00:16
7#
神之梦 发表于 2013-8-20 00:24
我不是传说中的,要说传说中也是一只小菜鸟,乘你们都睡了就来给你加分了
...

太谦虚了!不管怎么说你仍然是我们心目中的神!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马