黑马程序员技术交流社区

标题: 关于反射的问题 [打印本页]

作者: 乔钰博    时间: 2014-3-18 23:35
标题: 关于反射的问题
本帖最后由 乔钰博 于 2014-3-19 11:42 编辑

在一个泛型为Integer的ArrayList中存放一个String类型的对象,代码是这样的:
  1. public static void main(String[] args) throws Exception{
  2.      ArrayList<Integer> list = new ArrayList<Integer>();
  3.      Method method = list.getClass().getMethod("add", Object.class);
  4.      method.invoke(list, "i am a String");
  5.      System.out.println(list.toString());
  6. }
复制代码

但是不明白为什么通过反射就能把一个Sting类型的加进去
作者: 枫露    时间: 2014-3-19 00:05
通过反射调用method.invoke这个方法不止可以添加String类型,还可以添加double、float、、、、、等等,你可以看一下张孝祥高新技术的视频(那一节我忘了),看以看看附件,只要是object类的都可以往里面添加

1.png (192.87 KB, 下载次数: 18)

1.png

作者: 戒爱    时间: 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