Escribo un motor/biblioteca de juegos en el cual tengo una clase de despachador de eventos que distribuye eventos llamando métodos de escucha de clases de manejadores de eventos "registrados". Se puede registrar un controlador/oyente de eventos con el despachador de eventos llamando al método de despachador apropiado.Agregar código a una clase Java con Instrumentación: ¿ASM o BCEL?
Esto obviamente conduce a un código repetitivo para registrar cada controlador de eventos (y también otros aspectos de mi motor tienen código de placa base similar), así que me preguntaba: ¿qué tal usar Instrumentación para agregar todo el código necesario durante la carga de la clase de controlador de eventos, de modo que no es necesario un registro explícito con el despachador de eventos durante la codificación: la llamada al método de registro del despachador se agrega automáticamente cuando se ejecuta el programa.
Tengo entendido que para utilizar la instrumentación se debe utilizar alguna API de modificador de bytecode. Conozco dos: ASM y BCEL. ¿Cuál debería usar? Obviamente, esta es una tarea algo simple que estoy tratando de hacer, por lo que quiero la que sea más fácil de aprender y documentar mejor.
EDITAR: Aquí hay un ejemplo específico.
original clase de controlador de eventos:
@Handler //indicates this this class should be transformed
public class MouseEventHandler implements EventHandler<MouseEvent>
{
//hidden default constructor
public void handleEvent(MouseEvent event)
{ ... }
}
Después de la transformación:
@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 se ha incluido en JDK –
@ alexander.box: Sí, como una dependencia del transformador XSLTC Xalan, pero es una API no estándar y también está oculta en el paquete com.sun.org.apache.bcel.internal ! Mejor provee tu propio frasco. – Daniel
Ah, y mientras estoy en ello: ASM es una muy buena opción cuando las clases tienen que ser instrumentadas. Fácil de entender y usar También tiene una documentación muy buena. – Daniel