Я подозреваю, что то, что вы хотите сделать, может быть легче реализовано с помощью 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 системы событий.