4

假设我有一个我想调用的方法,它有一个字符串的参数

要打电话,我会做这样的事情.. myFunction(stringValue);

现在,如果我有一个值为“myFunction”的字符串,我将如何进行相同的调用,但动态调用..

就像是

method = [convert "myFunction" string to method];
method.invoke(stringValue);

我目前正在尝试类似

java.lang.reflect.Method 方法;

method = Class.forName("com.blah.MyActivity").getMethod('myFunction',String.class);
method.invoke (stringValue);

但收到错误 IllegalArgumentException Message expected receiver of type com.blah.MyActivity, but got java.lang.String

4

2 回答 2

4

指令:

method.invoke (stringValue);

需要将在其中method调用的对象。

因此,如果您尝试以下操作:

method = Class.forName("com.blah.MyActivity").getMethod('myFunction',String.class);
method.invoke(someInstanceOfMyActivity, stringValue);

它会起作用的。

文档: http ://docs.oracle.com/javase/6/docs/api/java/lang/reflect/Method.html

于 2012-06-28T18:08:48.183 回答
3

跟进我上面的评论:

这样做来调用com.blah.MyActivity::myFunction

com.blah.MyActivity activity = new com.blah.MyActivity() ;

method = Class.forName("com.blah.MyActivity").getMethod('myFunction',String.class);
method.invoke (activity, stringValue);

(原谅 C++ 语法)

我将尝试解释为什么它会这样工作:

方法实际上只是一种特殊类型的函数..它是为了让人们处理类和对象而创造的便利..

如您所知,在一个方法中,您总是有一个this变量.. 在此幕后,这是作为参数传入的,而是写成这样:

com.blah.MyActivity activity = new com.blah.MyActivity() ;
com.blah.MyActivity::myFunction( activity, stringValue )

你可以方便地写这个:

com.blah.MyActivity activity = new com.blah.MyActivity() ;
activity.myFunction(stringValue)

当您使用反射获得方法时,它只是一个“普通函数”。直接调用需要传入this参数。

这就是您遇到类型错误的原因...... myFunction 期望第一个隐藏参数是它包含的类的实例,您省略了它。

高温高压

于 2012-06-28T22:45:09.757 回答