Я пишу игровой движок/библиотеку, в которой у меня есть класс диспетчера событий, который отправляет события, вызывая методы прослушивания "зарегистрированных" классов обработчиков событий. Можно зарегистрировать обработчик/прослушиватель событий с диспетчером событий, вызвав соответствующий метод диспетчера.
Это, очевидно, приводит к некоторому шаблонному коду для регистрации каждого обработчика событий (а также другие аспекты моего движка имеют аналогичный код на основе bolierplate), поэтому мне было интересно - как просто использовать Instrumentation для добавления всего необходимого кода во время загрузки класс обработчика событий, так что при кодировании не требуется явная регистрация с диспетчером событий. При запуске программы автоматически добавляется вызов метода регистрационного диспетчера.
Я понимаю, что для использования Instrumentation следует использовать API-интерфейс байтового кода. Я знаю два - ASM и BCEL. Какой из них я должен использовать? Очевидно, это несколько простая задача, которую я пытаюсь сделать, поэтому я хочу тот, который легче изучить и лучше документировать.
EDIT: Вот пример.
Класс обработчика исходных событий:
@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)
{ ... }
}