黑马程序员技术交流社区
标题:
关于反射的问题
[打印本页]
作者:
乔钰博
时间:
2014-3-18 23:35
标题:
关于反射的问题
本帖最后由 乔钰博 于 2014-3-19 11:42 编辑
在一个泛型为Integer的ArrayList中存放一个String类型的对象,代码是这样的:
public static void main(String[] args) throws Exception{
ArrayList<Integer> list = new ArrayList<Integer>();
Method method = list.getClass().getMethod("add", Object.class);
method.invoke(list, "i am a String");
System.out.println(list.toString());
}
复制代码
但是不明白为什么通过反射就能把一个Sting类型的加进去
作者:
枫露
时间:
2014-3-19 00:05
通过反射调用method.invoke这个方法不止可以添加String类型,还可以添加double、float、、、、、等等,你可以看一下张孝祥高新技术的视频(那一节我忘了),看以看看附件,只要是object类的都可以往里面添加
1.png
(192.87 KB, 下载次数: 18)
下载附件
2014-3-19 00:03 上传
作者:
戒爱
时间:
2014-3-19 00:14
你的问题就是一个反射的应用问题:反射就是通过一个类的各个成分去获取类对应的字节码文件。
具体应用:我们获得了一个类的class文件后进行具体操作,如楼主遇到的就是通过class文件得到集合的add();
然后使用add给集合中添加元素
作者:
方青木
时间:
2014-3-19 00:17
因为泛型只是在编译时期起作用,而当编译结束生成.class文件后,泛型就消失了,所以我们通过反射获取的是.class中的东西,所以此时没有泛型就可以向集合中加入其它的元素
作者:
75100313
时间:
2014-3-19 07:51
泛型是给编译器看的 反射绕过了这点 当然可以加
作者:
路西法
时间:
2014-3-19 08:07
其实这道题在张老师的视频里有详细介绍 因为泛型定义的类型只在文件编译的过程中有用 ,当生成字节码文件时 泛型已经没有了 而反射是通过字节码来获取方法 此时获取的ArrayList是可以装任何类型参数的
作者:
房建斌
时间:
2014-3-19 09:00
其实不通过反射也可以添加进去的
作者:
乔钰博
时间:
2014-3-19 11:41
谢谢各位,差不多懂了
作者:
透过生活
时间:
2014-3-19 12:46
java虚拟机,编译后,就会去类型
然后利用反射,调用invoke()方法就可以传进去。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2