![](/img/trans.png)
[英]How to Invoke a method that take a Callable Interface or method as parameter with java reflection
[英]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[]
類型的參數,該參數表示要傳遞給要調用的方法的參數的集合。
相反,如果您打算模擬以下調用,則將null
為Object
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.