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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 乔钰博 中级黑马   /  2014-3-18 23:35  /  1106 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 乔钰博 于 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类型的加进去

8 个回复

倒序浏览
通过反射调用method.invoke这个方法不止可以添加String类型,还可以添加double、float、、、、、等等,你可以看一下张孝祥高新技术的视频(那一节我忘了),看以看看附件,只要是object类的都可以往里面添加

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

1.png
回复 使用道具 举报
你的问题就是一个反射的应用问题:反射就是通过一个类的各个成分去获取类对应的字节码文件。
具体应用:我们获得了一个类的class文件后进行具体操作,如楼主遇到的就是通过class文件得到集合的add();
然后使用add给集合中添加元素
回复 使用道具 举报
因为泛型只是在编译时期起作用,而当编译结束生成.class文件后,泛型就消失了,所以我们通过反射获取的是.class中的东西,所以此时没有泛型就可以向集合中加入其它的元素
回复 使用道具 举报
泛型是给编译器看的 反射绕过了这点 当然可以加
回复 使用道具 举报
其实这道题在张老师的视频里有详细介绍   因为泛型定义的类型只在文件编译的过程中有用 ,当生成字节码文件时 泛型已经没有了   而反射是通过字节码来获取方法 此时获取的ArrayList是可以装任何类型参数的
回复 使用道具 举报
其实不通过反射也可以添加进去的
回复 使用道具 举报
谢谢各位,差不多懂了
回复 使用道具 举报
java虚拟机,编译后,就会去类型
然后利用反射,调用invoke()方法就可以传进去。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马