黑马程序员技术交流社区

标题: 关于泛型视频中的问题? [打印本页]

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

我想知道反射是怎么跳过编译器的?反射不需要编译?
作者: 周海诚    时间: 2012-4-29 11:54
张老师的视频里说了
泛型是给编译器看的,编译生成的字节码会去掉泛型的类型信息
而反射式运行时的才被检测到,而运行时编译生成的字节码意见去掉泛型的类型信息
所以往某个泛型集合中加入其它类的数据例如:用反射得到的集合,在调用其add方法即可“

作者: 毕博    时间: 2012-4-29 16:05
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);
         }
}
作者: 罗旭维    时间: 2012-4-29 16:18
反射之所以说能跳过编译器是因为反射是在运行时操作类的,
创建类的对象和调用类的方法只用两种途径,
一是new 一个对象,通过对象调用方法,
二是以反射的方式,Class.forName("ClassName").newInstance(),然后通过getMethod()获得指定方法的Method对象再调用方法。
显然第二种方式可以在运行时进行,而那时编译器已经去掉了范型的类型信息,所以说可以用反射的方法绕过编译器。




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