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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李柯 中级黑马   /  2012-4-23 03:14  /  2194 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

看泛型视频时有这么一句话:
”由于编译生成的字节码会去掉泛型的类型信息,只要能跳过编译器,
就可以往某个泛型集合中加入其它类的数据例如:用反射得到的集合,在调用其add方法即可“

我想知道反射是怎么跳过编译器的?反射不需要编译?

3 个回复

倒序浏览
张老师的视频里说了
泛型是给编译器看的,编译生成的字节码会去掉泛型的类型信息
而反射式运行时的才被检测到,而运行时编译生成的字节码意见去掉泛型的类型信息
所以往某个泛型集合中加入其它类的数据例如:用反射得到的集合,在调用其add方法即可“

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
public class insertStrToArray {
         public static void main(String[] args) throws Exception {
                 ArrayList<Integer> list = new ArrayList<Integer>();             (泛型是integer)
                 Method methodAddString = list.getClass().getMethod("add", Object.class);
                 methodAddString.invoke(list, "abc");              (不过这里利用反射,加进去一个string类型。所以骗过了编译)
                 System.out.println(list);
         }
}
回复 使用道具 举报
反射之所以说能跳过编译器是因为反射是在运行时操作类的,
创建类的对象和调用类的方法只用两种途径,
一是new 一个对象,通过对象调用方法,
二是以反射的方式,Class.forName("ClassName").newInstance(),然后通过getMethod()获得指定方法的Method对象再调用方法。
显然第二种方式可以在运行时进行,而那时编译器已经去掉了范型的类型信息,所以说可以用反射的方法绕过编译器。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马