使用Java Reflection调用具有ActionEvent参数的方法的最简洁方法是什么?

时间:2015-03-10 16:26:31

标签: java reflection

这是我想要完成的一个非常简化的例子。我维护很久以前由其他人编写的代码,并且无法更改它。

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参数。

2 个答案:

答案 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;