Java аннотации для вызова методов - PullRequest
0 голосов
/ 26 июля 2011

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

class MyEventHandlers {

    @handler(id=“1”)
    public doSomething() {
      ...
    }

    @handler(id=“2”)
    public doSomethingElse() {
      ...
    }

}

....

subscribe(“event1”, new MyEventHandlers, “1”); 
//or maybe a better way to do this?!

....

//later, when I detect ‘event1’ I can process the required handler:
process(new MyEventHandlers, “1”)

Идея в том, что я хочу иметьспособ определения обработчиков для событий, а затем связывание событий с обработчиками.(на данный момент, событие - это некий строковый литерал).

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

1 Ответ

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

Я подозреваю, что то, что вы хотите сделать, может быть легче реализовано с помощью AOP Framework.

Но так как вы, возможно, захотите сделать это сами в любом случае:

Ключом к производительности является использование отражения только во время настройки. Поэтому, когда subscribe ing, вы создаете дескриптор обработчика и добавляете его в слушатели события. Дескриптор обработчика - это, по сути, java.lang.reflect.Method с экземпляром для его вызова и некоторыми знаниями о том, как получить данные о событиях, т.е. какие аргументы принимает метод.

Таким образом, вы можете реализовать запуск события с помощью

for (HandlerDescriptor desc : subscriptionMap.get(event)) {
    desc.trigger(event);
}

, что должно быть достаточно быстро. У вас могут быть разные дескрипторы HandlerDescriptors для обработчиков, которые принимают информацию о событии, ...

Вы также можете сделать subscribe быстрее, кэшируя java.lang.reflect.Method s на уровне класса (с помощью ключа идентификатора обработчика). Такой, что отражение используется только при subscribe использовании метода класса, не замеченного ранее.

Что я здесь не обсуждаю (подсказка: это стиль API)

  • Как назвать аннотации
  • Как получить данные контекста / события, вы можете посмотреть на JAX-RS. В основном вы также будете анализировать эту информацию во время установки, например, просматривая типы аргументов, чтобы вам не приходилось отправлять их в .trigger() раз.
  • Нужно ли подписаться / отписаться или вернуть подписчика от подписки. Это старый вопрос в стиле API системы событий.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...