字符串WITH Value的Java / Android Call方法

时间:2012-06-28 18:02:27

标签: java android reflection dynamic

假设我有一个我希望调用的方法,其中包含一个字符串

的参数

要打电话,我会做这样的事情...... 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 消息预期接收器类型为com.blah.MyActivity,但得到了java.lang.String

2 个答案:

答案 0 :(得分:3)

指示:

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

答案 1 :(得分: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希望第一个隐藏的参数是包含类的实例,你省略了它。

HTH