黑马程序员技术交流社区
标题:
关于泛型视频中的问题?
[打印本页]
作者:
李柯
时间:
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