Java使用fix参数调用自己的私有方法
以前,我有一个Swing类,它有许多if-else语句。在使用java反射删除所有if-else之后,我可以成功地调用它自己的方法。但是,我仍然无法将参数传递到方法中。如何使下面的代码与传递ActionEvent参数一起工作Java使用fix参数调用自己的私有方法,java,reflection,Java,Reflection,以前,我有一个Swing类,它有许多if-else语句。在使用java反射删除所有if-else之后,我可以成功地调用它自己的方法。但是,我仍然无法将参数传递到方法中。如何使下面的代码与传递ActionEvent参数一起工作 public void actionPerformed(ActionEvent e) { try { //Method method = this.getClass().getDeclaredMethod(e.getActionCommand());
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");
}
只需将参数作为附加参数传递给:
只需将参数作为附加参数传递给:
您需要更改两个方法,一个用于查找接受ActionEevent的方法,另一个用于传递事件
try {
Method method = getClass().getMethod(e.getActionCommand(), ActionEvent.class);
method.invoke(this, e);
} catch (Exception e) {
// log the 'e' exception
}
您需要更改两个方法,一个用于查找接受ActionEevent的方法,另一个用于传递事件
try {
Method method = getClass().getMethod(e.getActionCommand(), ActionEvent.class);
method.invoke(this, e);
} catch (Exception e) {
// log the 'e' exception
}
这个
反映一个不带参数的方法,假定,例如,getActionCommand引用方法名generate。它将反映generate方法,但您希望反映generateActionEvent e,它只是一个不同的方法提示:重载
你得反省一下
Method method = this.getClass().getMethod(e.getActionCommand(), ActionEvent.class);
然后做一个
method.invoke(this, e);
这个
反映一个不带参数的方法,假定,例如,getActionCommand引用方法名generate。它将反映generate方法,但您希望反映generateActionEvent e,它只是一个不同的方法提示:重载
你得反省一下
Method method = this.getClass().getMethod(e.getActionCommand(), ActionEvent.class);
然后做一个
method.invoke(this, e);
只查找公共方法。你需要
此外,还需要查找参数类型:
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));
}
只查找公共方法。你需要
此外,还需要查找参数类型:
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));
}
我试过了,得到了这个异常:java.lang.NoSuchMethodException:com.upd.ui.\u摘要。generate@Reusable:您在getMethod调用中得到该异常,而不是在invoke调用中,只有getMethod可以抛出该异常!您在标题中提到private,但代码中没有private方法。如果你的方法实际上是私有的,那么你必须使用getDeclaredMethod,因为getMethod只能找到公共方法。我希望将该方法作为私有方法,因为将其公开给其他人肯定会产生进一步的问题,即为什么该方法是公共的!谢谢我试过了,得到了这个异常:java.lang.NoSuchMethodException:com.upd.ui.\u摘要。generate@Reusable:您在getMethod调用中得到该异常,而不是在invoke调用中,只有getMethod可以抛出该异常!您在标题中提到private,但代码中没有private方法。如果你的方法实际上是私有的,那么你必须使用getDeclaredMethod,因为getMethod只能找到公共方法。我希望将该方法作为私有方法,因为将其公开给其他人肯定会产生进一步的问题,即为什么该方法是公共的!谢谢成功了!谢谢顺便说一句,只有当我将方法声明为public时,此代码才有效。为什么我改成私人时失败了?成功了!谢谢顺便说一句,只有当我将方法声明为public时,此代码才有效。为什么我改成私人时失败了?