Java调用带有fix参数的自己的私有方法



之前,我有一个Swing类,它有许多if-else语句。在使用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");
}

直接将参数作为附加参数传递给Method.invoke():

method.invoke(this, e);

This

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);

您需要更改两个方法,一个用于查找一个接受actionevent的方法,另一个用于传递该事件。

try {
   Method method = getClass().getMethod(e.getActionCommand(), ActionEvent.class);
   method.invoke(this, e);  
} catch (Exception e) {
   // log the 'e' exception
}

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));
}

相关内容

最新更新