Отражение Java: как передать метод другому, чтобы он мог выполняться (без интерфейсов) - PullRequest
1 голос
/ 02 марта 2011

Я хотел бы иметь метод, который может вызывать метод, который передается ему. Идея состоит в том, чтобы повторить попытку, если есть исключение мертвой блокировки, и вместо добавления try catch в каждое место, где я хочу это, я бы предпочел иметь утилиту, которая работает как retryExecution(Method method). Внутри метода retryExecution находится вся многократно используемая логика для обработки повторных блокировок. Я хотел бы сделать это без использования AOP, а также без использования интерфейса (поскольку я рассказываю методу retryExcution, какой метод вызывать, а не зависит от имени метода через интерфейс).

Ответы [ 4 ]

10 голосов
/ 02 марта 2011

Вы используете интерфейс.

Вы используете интерфейс.

Вы используете интерфейс.

Или вы используете абстрактный класс, который является вариацией этой темы.

Если вы отказываетесь следовать структуре языка для решения этой проблемы и «используете интерфейс», вы читаете javadoc для java.lang.reflect и получаете объект Method и передаете его.http://java.sun.com/developer/technicalArticles/ALT/Reflection/

Разработчики Java рассматривали и отвергали вызываемые методы как объекты первого класса (по аналогии, скажем, со значениями функций C ++ или C).

0 голосов
/ 03 марта 2011

Это легко с лямбда-выражениями .

  1. Обновление до Java SE 8 .

  2. Напишите некоторый код, используя лямбду:

    int sum = 0;
    list.forEach(#{ e -> sum += e.size(); });
  3. Войдите в систему freenode и присоединитесь к одному из #concatenative, #python, #haskell или других и поздравьте их с дальновидностью

  4. Продайте свою копию SICP для оплаты победного обеда.

0 голосов
/ 03 марта 2011

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

public Object retry(Object objectWithTheMethod, String methodName) {
    try {
        Method method = objectWithTheMethod.getClass().getMethod(methodName);
        return method.invoke(objectWithTheMethod);
    } catch (IllegalAccessException e) {
    } catch (InvocationTargetException e) {
    } catch (NoSuchMethodException e) {
    }
}

Это немного усложняется, если метод требует каких-то параметров.Затем вам нужно будет указать классы параметров для getMethod.Т.е. если метод требует один параметр String:

Method method = objectWithTheMethod.getClass().getMethod(methodName, String.class);
0 голосов
/ 02 марта 2011

Для этого вам необходимо предоставить экземпляр Method, Object, для которого вы хотите вызвать метод, и необходимые параметры.

См. Метод invoke надокументация .

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