假设我有一个我希望调用的方法,其中包含一个字符串
的参数要打电话,我会做这样的事情...... 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
答案 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