Как сделать ссылку между именем функции и фактической функцией в Java - PullRequest
1 голос
/ 13 декабря 2011

Я создаю пользовательский интерфейс в NetBeans (кодирование вручную, более гибкий) с несколькими панелями инструментов.

Я пытаюсь создать actionListener для каждой кнопки.Я извлекаю имена функций из XML и анализирую их в строку.Я напишу реализации для этих функций в отдельном классе, но моя проблема заключается в следующем:

Как создать ссылку между именем функции и строкой, содержащей ее имя?

Пример: String равен Open(), функция будет Open(someParameter), а в классе определений будет static void Open(param).

Ответы [ 3 ]

1 голос
/ 13 декабря 2011

Прежде всего, рассмотрите мой комментарий о том, что ваше представление о динамическом поведении кнопок, разрешенном из строк, является неправильным подходом. Однако, если вам все еще нужно именно то, что вы просили, вам понадобится Reflection API .

Вот пример:

    Class c = SomeClassWithMethods.class;
    Method m = c.getMethod("someMethodName", String.class, Integer.class, Integer.TYPE);
    m.invoke(baseObjectFromWhichToCallTheMethod, "stringParam", 10, 5);

Добавлено:

Другой вариант, который немного красивее, чем отражение, но все еще грязный дизайн, - это использовать карту, чтобы связать эти Strings с методами. Код немного длиннее, но с точки зрения Java это намного лучше, чем использование отражения для вашей задачи (если у вас нет особых требований, о которых я не знаю). Вот как это будет работать:

//Interface whose instances will bind strings to methods
interface ButtonClickHandler {
    void onClick();
}

class SomeClassYouNeed {
    //One of the methods that will be bound to "onButtonOneClick()"
    public void onButtonOneClick() {
        log.info("ButtonOneClick method is called");
    }

    public void onButtonTwoClick() {
        log.info("ButtonTwoClick method is called");
    }

    //Map that will hold your links
    private static Map<String, ButtonClickHandler> buttonActionMap;

    //Static constructor to initialize the map
    static {
        buttonActionMap = new Map<String, ButtonClickHandler>();
        buttonActionMap.put("onButtonOneClick()",new ButtonClickHandler() {
            @Override
            public void onClick() {
                onButtonOneClick();
            }
        });
        buttonActionMap.put("onButtonTwoClick()",new ButtonClickHandler() {
            @Override
            public void onClick() {
                onButtonTwoClick();
            }
        });
    }

    public void callByName(String methodName) {
        final ButtonClickHandler handler = buttonActionMap.get(methodName);
        if (handler == null) {
            throw new IllegalArgumentException("No handler found by name: "+methodName); 
        }
        handler.onClick();
    }
}

После того, как вы вызовете callByName("onButtonTwoClick()"), он извлечет соответствующий экземпляр ButtonClickHandler, который будет использовать статический метод onButtonTwoClick() для обработки нажатия кнопки.

1 голос
/ 13 декабря 2011

Мне кажется, что вы ищете эквивалент функции JS "eval" в Java. Это может помочь.Тем не менее, как сказал @Max, это, как правило, не очень хорошая идея, возможно, вы захотите переосмыслить свой дизайн.

0 голосов
/ 13 декабря 2011

Если я правильно понял ваш вопрос, вы пытаетесь сгенерировать ваши файлы кода на основе некоторых строк, взятых из файла XML.Я могу предложить вам эту библиотеку для генерации ваших кодов.Для учебников вы можете посетить эту ссылку.Вы даже можете использовать Java Reflection API .Вот ссылка для учебника.

Вам решать, какой из двух вышеперечисленных вы используете.

...