之前,我有一个包含许多if-else语句的Swing类。在使用java反射删除所有if-else之后,我可以成功调用自己的方法。但是,我仍然无法将参数传递给方法。如何使下面的代码与传递ActionEvent参数一起工作?
public void actionPerformed(ActionEvent e) {
try {
//Method method = this.getClass().getDeclaredMethod(e.getActionCommand());
Method method = this.getClass().getMethod(e.getActionCommand() );
method.invoke(this);
} catch (IllegalArgumentException e1) {
e1.printStackTrace();
} catch (IllegalAccessException e1) {
e1.printStackTrace();
} catch (InvocationTargetException e1) {
e1.printStackTrace();
} catch (SecurityException e1) {
e1.printStackTrace();
} catch (NoSuchMethodException e1) {
e1.printStackTrace();
}
}
public void generate(ActionEvent e){
System.out.println("Generating");
}
答案 0 :(得分:2)
只需将参数作为Method.invoke()
的附加参数传递:
method.invoke(this, e);
答案 1 :(得分:2)
此
Method method = this.getClass().getMethod(e.getActionCommand() );
反映了一个没有参数的方法(假设e.getActionCommand()
引用了方法名"generate"
)。它将反映方法generate()
,但您想反映generate(ActionEvent e)
,这只是一种不同的方法(提示:重载)
你必须反映
Method method = this.getClass().getMethod(e.getActionCommand(), ActionEvent.class);
然后再做一次
method.invoke(this, e);
答案 2 :(得分:1)
您需要更改两个方法,一个用于查找采用ActionEevent的方法,另一个方法用于传递事件。
try {
Method method = getClass().getMethod(e.getActionCommand(), ActionEvent.class);
method.invoke(this, e);
} catch (Exception e) {
// log the 'e' exception
}
答案 3 :(得分:1)
Class.getMethod()
只找到公共方法。您需要Class.getDeclaredmethod()
。
此外,您还需要查找参数类型:
Method method = getClass().getDeclaredMethod(e.getActionCommand(), ActionEvent.class);
我更喜欢使用这样的辅助方法:
public static Method findMethodByNameAndArgs(final Class<?> clazz,
final String name, final Object... args) {
for (final Method method : clazz.getDeclaredMethods()) {
if (method.getName().equals(name)) {
final Class<?>[] parameterTypes = method.getParameterTypes();
if (parameterTypes.length == args.length) {
boolean matchArgs = true;
for (int i = 0; i < args.length; i++) {
final Object param = args[i];
if (param != null && !parameterTypes[i].isInstance(param)) {
matchArgs = false;
break;
}
}
if (matchArgs) return method;
}
}
}
throw new IllegalArgumentException(
"Found no method for name '" + name + "' and params "
+ Arrays.toString(args));
}