Я пишу игровой движок/библиотеку, в которой у меня есть класс диспетчера событий, который отправляет события, вызывая методы слушателя "зарегистрированных" классов обработчиков событий. Можно зарегистрировать обработчик/прослушиватель событий в диспетчере событий, вызвав соответствующий метод диспетчера.
Это, очевидно, приводит к некоторому шаблонному коду для регистрации каждого обработчика событий (а также другие аспекты моего движка имеют аналогичный код bolierplate), поэтому мне было интересно - как насчет того, чтобы просто использовать Instrumentation для добавления всего необходимого кода во время загрузки класс обработчика событий, так что при кодировании не требуется явная регистрация в диспетчере событий - вызов метода регистрации диспетчера добавляется автоматически при запуске программы.
Насколько я понимаю, для того, чтобы использовать Instrumentation, нужно использовать некоторый API модификатора байт-кода. Я знаю два — ASM и BCEL. Какой из них я должен использовать? Очевидно, что это довольно простая задача, которую я пытаюсь решить, поэтому мне нужна та, которую легче изучить и лучше задокументировать.
РЕДАКТИРОВАТЬ: Вот конкретный пример.
Исходный класс обработчика событий:
@Handler //indicates this this class should be transformed
public class MouseEventHandler implements EventHandler<MouseEvent>
{
//hidden default constructor
public void handleEvent(MouseEvent event)
{ ... }
}
После преобразования:
@Handler
public class MouseEventHandler implements EventHandler<MouseEvent>
{
public MouseEventHandler()
{
//add this line of code to default constructor
Game.getEventDispatcher().addEventHandler(this);
}
public void handleEvent(MouseEvent event)
{ ... }
}