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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 常佳杰 中级黑马   /  2012-6-27 08:56  /  1996 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 常佳杰 于 2012-6-28 11:53 编辑

ArrayList<String> collcetion2 = new ArrayList<String>();
collcetion2.add("abc");
collcetion2.getClass().getMethod("add", Object.class).invoke(collcetion2,50);//这句话的含义,
为什么要getClass()?  我的理解是得到collection的class文件,但得到class文件又是干嘛?
.getMethod("add", Object.class)  getMethod()不是得到所需要的方法吗?这个里边的第二个参数说明了什么?

                  

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

9 个回复

倒序浏览
本帖最后由 Forever。 于 2012-6-27 09:38 编辑

参数列表嘛。ArrayList这个类中有两个add方法。其中一个是:add(E e)
                                                                                               将指定的元素添加到此列表的尾部。
                                                                           另一个是:add(int index, E element)
                                                                                              将指定的元素插入此列表中的指定位置

在Class类中,getMethod方法是这样定义的:public Method getMethod(String name, Class<?>... parameterTypes)throws NoSuchMethodException, SecurityException
其中第一个参数是方法名称,第二个参数是一个Class对象的一个数组。这个数组中有几个元素即表示此方法的参数列表有几个,当然也需要其中的类型是一一对应的。
在楼主的程序中第二个参数是一个Class对象,这也是可以的,这也就表明这个方法内有一个参数。

楼主的invoke方法有两个参数,我也多解释一下,第一个参数是从中调用底层方法的对象,也就是到底是谁要用这个方法;第二个是调用这个方法需要的参数,上面说了
有一个参数,但是楼主传入一个50,不是一个String类型的。虽然你存进去是没有问题的,但是你取出来的时候可能会报错:说你的类型不匹配。

楼主有什么不明白的还可以问我。


评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
请详解好吗?
回复 使用道具 举报
本帖最后由 wyl530274554 于 2012-6-27 09:47 编辑

getMethod()由谁来调用的?
是对象。
集合里装的全是对象引用
确定对象类型,就要用到你那class文件

我理解就是找到对象所属的类文件,再调用类文件里方法

回复 使用道具 举报
wyl530274554 发表于 2012-6-27 09:33
getMethod()由谁来调用的?
是对象。
集合里装的全是对象引用

其实api说的很清楚 你在代码里一定不是在找类文件,找的永远是对象或者类……
回复 使用道具 举报
参数列表嘛。ArrayLi

很抱歉怎么那会看的时候你里边的回复就两句话,现在看说的还挺详细呵呵 怪了..
还想问一下
  1. collcetion2.getClass().getMethod("add", Object.class).invoke(collcetion2,50);
复制代码
这句话在什么时候才用呢?
回复 使用道具 举报
Forever。 发表于 2012-6-27 09:53
其实api说的很清楚 你在代码里一定不是在找类文件,找的永远是对象或者类…… ...

可以这样理解
在内存加载了一个这样的类文件
回复 使用道具 举报
常佳杰 发表于 2012-6-27 09:53
很抱歉怎么那会看的时候你里边的回复就两句话,现在看说的还挺详细呵呵 怪了..
还想问一下这句话在什么时 ...

说实在的 学了反射,我在编程的时候几乎就用到过一次。个人认为反射在写应用层的东西时应该会很少用到。可能你在做到架构师级别的时候,需要去架构一个项目的架子的时候会用到反射技术。
如果你向更深入的了解建议你去多研究一下web框架,比如hibernate、spring。
回复 使用道具 举报
说实在的 学了反射,我在编程的时候几

呵呵 就是想多明白点东西...好的{:soso_e130:}
回复 使用道具 举报
这就是java编译时去类型化的实例了,你虽说已经定义了arraylist 当中只能存放String类型的变量了,但是在javac编译的时候已经去掉了这个string的限制,也就是你的字节码文件当中是不可能再有泛型化的类型了,就好像你定义了new 出来了两个String对象,然后你去比较是否相等 肯定是返回false,但是你用getclass返回的值得话就是相等的,这也一样,既然在编译时去类型化,咱们跳过这个阶段就行了,getclass获得字节码后,调用getMethod获得add方法,第二个参数是你要传给add方法的参数的类型,不过写成了字节码形式,这个API文档里面有 Class 类的getMethod方法里面的参数的类型 你就明白了 ,还有获得方法之后你要知道在哪个对象身上调用,这里你要在collection2里面加东西,所以第一个参数是collection这个对象 第二个参数要跟你前面的类型一致,所以这就是反射的作用,可以运行时动态加载

评分

参与人数 1技术分 +1 收起 理由
刘蕴学 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马