簡體   English   中英

使用Java Reflection調用帶有ActionEvent參數的方法的最干凈方法是什么?

[英]What is the cleanest way to use Java Reflection to invoke a method with an ActionEvent parameter?

這是我要完成的工作的非常簡單的示例。 我維護的是很久以前由其他人編寫的代碼,無法更改它。

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參數。

這里的問題是in中的null

m.invoke(obj, null);

推斷為Object[]類型的參數,該參數表示要傳遞給要調用的方法的參數的集合。

相反,如果您打算模擬以下調用,則將nullObject

obj.test(null);

那相當於

m.invoke(obj, (Object) null);

好吧,您將不得不以一種或另一種方式使用正確的參數來調用該方法。

但是請注意,前一段時間,我寫了一個反思性的動作

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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM