Java вызывает свой собственный закрытый метод с параметром fix - PullRequest
1 голос
/ 15 июля 2011

Раньше у меня был класс Swing, в котором есть много операторов if-else.удалив все if-else с помощью java-отражения, я могу успешно вызвать его собственный метод.Тем не менее, я все еще не могу передать параметр в метод.Как заставить приведенный ниже код работать с передачей параметра 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");
}

Ответы [ 4 ]

2 голосов
/ 15 июля 2011

Это

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 голосов
/ 15 июля 2011

Просто передайте аргумент (ы) в качестве дополнительных аргументов Method.invoke():

method.invoke(this, e);
1 голос
/ 15 июля 2011

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));
}
1 голос
/ 15 июля 2011

Вам нужно изменить два метода, один для поиска метода, который принимает ActionEevent, а второй для передачи события.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...