请教一下Method.invoke方法

ninesea 2008-02-16 08:40:29
java.lang.reflect.Method
public Object invoke(Object obj,Object... args)
参数:
obj - 从中调用底层方法的对象
args - 用于方法调用的参数
返回:
使用参数 args 在 obj 上指派该对象所表示方法的结果

我想问一下这个方法到底是什么意思 比方说 methodObj.invoke(Object obj,Object...args)
我知道methodObj是一个Method类型的对象 其实就相当于某个类的一个方法 到底args是这个方法的参数 还是这个方法是args里定义的一个方法

我看Core java 7th里的例子感觉有些不太明白
P195:
invoke方法的签名是:
Object invoke(Object obj,Object...args)
...
对于静态方法,第一个参数可以被忽略,即可以将它设置为null
例如,假设用mI代表Employee类的getName方法,下面这条语句显示了调用这个方法的格式:
String n=(String)m1.invoke(harry);
...
例如,假设m2代表Employee类的getSalary方法,那么返回的实际类型是Double,因此必须相应的进行类型转换。
double s=(Double)m2.invoke(harry);
=======================================
这里的harry是一个Employee类型的对象 Employee harry=new Employee("Harry Hacker",35000,10,1,1989);
这样看上去String n=(String)m1.invoke(harry);相当于调用harry.getName()

然后再看P196页的例子
import java.lang.reflect.*;
public class MethodPointerTest {
public static void main(String[] args)throws Exception{
Method square=MethodPointerTest.class.getMethod("square", double.class);
Method sqrt=Math.class.getMethod("sqrt", double.class);
printTable(1,10,10,square);
printTable(1,10,10,sqrt);
}
public static double square(double x){
return x*x;
}
public static void printTable(double from,double to,int n,Method f){
System.out.println(f);
double dx=(to-from)/(n-1);
for (double x=from;x<=to;x+=dx){
try{
double y=(Double)f.invoke(null, x);
//我不能明白的就是这里了 这里相当于调用square(x) 而前面的例子的格式是x.square
System.out.printf("%10.4f|%10.4f%n",x,y);
}
catch (Exception e){
e.printStackTrace();
}
}
}
}

麻烦用通俗语言教我一下2个参数和返回结果都是什么东西 谢谢
...全文
11135 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
Zh_java_2009 2012-02-14
  • 打赏
  • 举报
回复
多谢。
beijing_go 2011-12-09
  • 打赏
  • 举报
回复
yumen
gohikinggo 2011-09-06
  • 打赏
  • 举报
回复
楼主真好,自己解决问题,把解决思路和过程也共享了..顶
javhu 2011-08-15
  • 打赏
  • 举报
回复
此贴必火啊~~~问题很经常遇到,一致都是直接跳过,今天碰巧遇到楼主大仙,感谢万分啊~~~终于弄明白了!顶~~~
huangzf128 2011-05-31
  • 打赏
  • 举报
回复
省略的是函数所属的对象吧, 静态方法可以静态引用,所以第一个参数可以设为null,
xyweizhi 2011-04-27
  • 打赏
  • 举报
回复
楼主NB啊,自己给解决了,V5!
ccking001 2011-01-01
  • 打赏
  • 举报
回复
也解决了我的问题 楼主精神可嘉啊!!
scorpiomiracle 2010-09-14
  • 打赏
  • 举报
回复
ninesea,lz精神可嘉啊
小凤雏 2010-08-10
  • 打赏
  • 举报
回复
up you..
wuyanfengstefanie 2010-08-05
  • 打赏
  • 举报
回复
我也遇到了
jnzw1986 2010-07-15
  • 打赏
  • 举报
回复
高手,领教了。。我也遇到这个问题,楼主的自问自答让我懂了。。呵呵。。多谢。。。。
xuwei1027 2010-07-09
  • 打赏
  • 举报
回复
学习 一下。
gdreamlend 2010-06-01
  • 打赏
  • 举报
回复
我还是没看明白啊。。。。。
KevinWuwj 2009-08-21
  • 打赏
  • 举报
回复
谢谢,,今天碰到相同问题,,,看API看了半天,越看越糊涂。
dingyun870203 2009-08-15
  • 打赏
  • 举报
回复
幸亏自己提问自己解决....
我也遇到这问题,刚好在这弄明白了,谢谢啊..顶楼主
zxcvbnmluton 2009-07-16
  • 打赏
  • 举报
回复
很少有你这样,解决问题后还将答案写出来的。
ninesea 2008-02-17
  • 打赏
  • 举报
回复
昨天晚上躺在床上又想了一下 原来是很简单的东西
xxx.invoke(obj,args)返回的结果是obj.xxx(args)

String n=(String)m1.invoke(harry); 省略的是第二个参数 我一直当成省略的是第一个参数
P195:
Object invoke(Object obj,Object...args)
第一个参数是隐式参数,其余的对象提供了显示参数。
对于静态方法,第一个参数可以被忽略,即可以将它设置为null。
P197:
Public Object invoke(Object implicitParameter,Object explicitParameters)
========================================================================
就是因为这三行 浪费了我好多时间啊 原来可省略的不是隐式参数 忽略的意思就是设置为null而不是省略 汗 是我的理解问题吗?
ninesea 2008-02-16
  • 打赏
  • 举报
回复
package java.lang.reflect;

import sun.reflect.MethodAccessor;

这个sun.reflect.MethodAccessor的代码哪里可以找到?src包里好像没有
ninesea 2008-02-16
  • 打赏
  • 举报
回复
String n=(String)m1.invoke(harry);
这里返回的结果 应该是harry.getName()得到的结果

double y=(Double)square.invoke(null,x);
按照上面的格式 这里的结果应该是x.square? 可是square跟x没有任何关系 它的返回结果却是square(x)

所以不明白每个参数到底代表的什么意思

Object invoke(Object obj,Object...args)
那本书上解释说:调用该对象所描述的方法,传递给定参数,并返回方法的返回值。
我无法理解这句话 该对象指的是哪一个?所描述的方法应该xxx.invoke中xxx了 传递给点的参数?args吗?
ninesea 2008-02-16
  • 打赏
  • 举报
回复
Employee harry=new Employee("Harry Hacker",35000,10,1,1989);
假设用mI代表Employee类的getName方法,下面这条语句显示了调用这个方法的格式:
String n=(String)m1.invoke(harry);
这里的m1是harry的一个方法

try{
double y=(Double)f.invoke(null, x);
这里的x却是f的参数
加载更多回复(1)

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧