Sto scrivendo un motore di gioco/libreria in cui dispongo di una classe dispatcher di eventi che invia eventi chiamando metodi listener di classi di gestori eventi "registrati". Si può registrare un gestore di eventi/listener con il dispatcher di eventi chiamando il metodo di dispatcher appropriato.Aggiunta di codice a una classe Java con Strumentazione: ASM o BCEL?
Questo ovviamente porta ad alcuni codici di codice per la registrazione di ogni gestore di eventi (e anche altri aspetti del mio motore hanno un codice bolierplate simile), quindi mi chiedevo: che ne dici di usare semplicemente Instrumentation per aggiungere tutto il codice necessario durante il caricamento della classe del gestore di eventi, in modo che non sia necessaria alcuna registrazione esplicita con il dispatcher di eventi durante la codifica: la chiamata al metodo di registrazione del dispatcher viene aggiunta automaticamente quando viene eseguito il programma.
Sono a conoscenza del fatto che per poter utilizzare Instrumentation si dovrebbe utilizzare qualche API di modifica bytecode. Ne conosco due: ASM e BCEL. Quale dovrei usare? Ovviamente, questo è un compito piuttosto semplice che sto cercando di fare, quindi voglio quello che è più facile da imparare e meglio documentato.
MODIFICA: ecco un esempio specifico.
originale classe gestore di eventi:
@Handler //indicates this this class should be transformed
public class MouseEventHandler implements EventHandler<MouseEvent>
{
//hidden default constructor
public void handleEvent(MouseEvent event)
{ ... }
}
Dopo la trasformazione:
@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)
{ ... }
}
bcel è stato incluso in JDK –
@ alexander.box: Sì, come dipendenza dal trasformatore XSLTC Xalan, ma è API non standard e anche nascosto nel pacchetto com.sun.org.apache.bcel.internal ! Meglio fornire il tuo barattolo. – Daniel
Oh, e anche se ci sono: ASM è un'ottima scelta quando le classi devono essere strumentate. Facile da capire e da usare. Inoltre ha una documentazione molto bella. – Daniel