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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 褚代江 于 2012-5-10 14:05 编辑

首先向林康 同志道歉,我错了,是我将一个单词写错了,引出了很多的问题。这个也提醒大家注意,java都是英语的,所以单词写错是常事,要好好检查自己的单词拼写。
下面我们再来看看《关于反射中的Method类得到无参数方法的问题 》
像得到一个toStirng方法。toString是一个无参的方法,那么在用反射的到此方法时,我们该怎样写入getMethod后面的参数呢。

Method methodToString=String.class.getMethod("toString",null);//①
这里因为是无参数,所以要写成null是没有什么疑问的。那么现在我们该怎样调用呢?‘

System.out.println(methodToString.invoke("abc"));
这里打印出abc是没有问题的。
但是我现在想传人一个int[]类型的,并打印出来。这时
System.out.println(methodToString.invoke(new String[]{"a"}));//②

但是这时将①②放在一起就会报错
错误提示:java.lang.IllegalArgumentException: object is not an instance of declaring class

在这里纠结了半天,int[]类型有toString方法的啊。但是怎么就有错误呢!!!!!!!!!!!!!!

困惑了,但是后来在贠靖同志的帮助下。发现了我们在②调用toString方法时,使用的是String.class字节码。但是我们却用int[]类型上。所以这样会出现上面的错误。那么我门可以这样来改正
将①换成Method methodToString=int[].class.getMethod("toString",null);//③

这样就可以传入int[]的了,但是这时有传不了Stirng的字符串了啊,后来我们想到toStirng是Object类的。
所以直接改成Method methodToString=Object.class.getMethod("toString",null);//④

这样不管是传人int[],还是Stirng,还是String[]都可以了,但是这里强调一点,在其他类复写了toString方法后,那么在用反射得到这个类的toString方法时可能输出的会有所不同的。

总之大家多考虑下问题,其实总会有解决的办法的。
在这里再次感谢贠靖同志啊,嘿嘿

评分

参与人数 2技术分 +1 黑马币 +20 收起 理由
贠(yun)靖 + 1 老师给钱,我给分 哈哈
职业规划-刘倩老师 + 20 不错的分享!赞一个!

查看全部评分

8 个回复

倒序浏览
我的帖子都沉了,老师还看到了,欣慰啊
回复 使用道具 举报
我就纳闷了,既然toString方法都已经存在了,那何必还要用反射取得这个方法呢??你看,你用反射搞出这么多问题,在我现在的水平上,没有看出来反射有什么用处。
回复 使用道具 举报
反射有一个好处:就是运行效率更高!这是以前的老师说过的。
回复 使用道具 举报
Method类简介
代表某个类中的一个成员方法
得到类中的某一个方法

12 Method charAt = Class.forName("java.lang.String")                      .getMethod("charAt", int.class);
调用方法
•通常方法

12 String str = "abcdef"; System.out.println(str.charAt(2));

•反射方法

1 System.out.println(charAt.invoke(str,2));
如果传递给Method对象的invoke()方法的第一个参数为null,这意味着什么呢?说明该Method对象对应的是一个静态方法

回复 使用道具 举报
方法一
这样调用:mainMethod.invoke(null, (Object)new String[]{"111","222"});做一个类型强转
方法二
这样调用:mainMethod.invoke(null, new Object[]{new String[]{"111","222"}});也是把String[]看做了一个Object

回复 使用道具 举报
本帖最后由 褚代江 于 2012-5-11 17:49 编辑
黄坚声 发表于 2012-5-11 16:42
方法一
这样调用:mainMethod.invoke(null, (Object)new String[]{"111","222"});做一个类型强转
方法二


你的这两种方法都错了的,当时我们都试过了的,你可以试试

当你那个String数组变成int[]时,不管你在前面加(Object),还是在把他new成一个Object类型的数组,都会在运行是报错的
回复 使用道具 举报
高云飞 发表于 2012-5-11 16:25
我就纳闷了,既然toString方法都已经存在了,那何必还要用反射取得这个方法呢??你看,你用反射搞出这么多 ...

其实这个我也没怎么用到,但是框架的底层原理都是反射得到的属性,方法什么的,等到你学了ssh就知道了,而且听前几期的说,在安卓里面用的也很多的,所以就深挖了下,嘿嘿,
要是就自己写个小项目,是用不到的
回复 使用道具 举报
褚代江 发表于 2012-5-11 17:43
其实这个我也没怎么用到,但是框架的底层原理都是反射得到的属性,方法什么的,等到你学了ssh就知道了, ...

自学过android了,在教程里,总听到什么反射机制、回调机制的,结果,虽然我不懂那些,但是不妨碍我用。在形式上会用了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马