这是我想要完成的一个非常简化的例子。我维护很久以前由其他人编写的代码,并且无法更改它。
import java.awt.event.ActionEvent;
import java.lang.reflect.Method;
public class Main {
public static void main(String[] args) throws Exception {
Class cls = Class.forName("Main");
Main obj = (Main) cls.newInstance();
Method m = cls.getDeclaredMethod("test", ActionEvent.class);
m.invoke(obj, null); <--- throws an IllegalArgumentException
}
public void test(ActionEvent x) {
System.out.println("Yeah");
}
}
以上代码抛出java.lang.IllegalArgumentException: wrong number of arguments
。我知道我可以将new ActionEvent(new Object(), 0, null)
作为参数传递,但我不确定这是实现这一目标的最佳/最干净的方法。注意,方法测试实际上并不使用ActionEvent参数。
答案 0 :(得分:3)
这里的问题是
中的null
m.invoke(obj, null);
被推断为类型Object[]
的参数,它表示要传递给被调用方法的参数集合。
相反,如果您的目的是模拟以下调用,请将null
强制转换为Object
obj.test(null);
这相当于
m.invoke(obj, (Object) null);
答案 1 :(得分:1)
好吧,您必须以某种方式使用正确的参数调用该方法。
但请注意,前段时间,我写了reflective action。
try {
Action test = new ReflectiveXAction(this, "test");
} catch (NoSuchMethodException ex) {
ex.printStackTrace();
}
...
test.actionPerformed(new ActionEvent(this, ActionEvent.ACTION_PERFORMED, "someId"));
或
test.actionPerformed(null);
通常,actionPerformed方法会被JButton这样的组件调用。
也许你觉得它很有用。该库是开源的。
教程:http://www.softsmithy.org/lib/current/docs/tutorial/swing/action/index.html#reflective
您可以直接从Maven Central获取图书馆:
<dependency>
<groupId>org.softsmithy.lib</groupId>
<artifactId>softsmithy-lib-swing</artifactId>
<version>0.5</version>
</dependency>
或者您可以从此处下载:http://sourceforge.net/projects/softsmithy/files/softsmithy/v0.5/
如果您正在使用Java SE 8(推荐),您还可以考虑使用lambdas /方法引用,例如(另):
ActionListener test = this::test;