2008-12-04 18 views
6

Tengo un paso de compilación posterior que manipula el bytecode de Java de las clases generadas. Me gustaría hacer la vida lo menos dolorosa posible para los usuarios de la biblioteca, así que estoy buscando maneras de hacer que este proceso sea automático y (de ser posible) agnóstico para el compilador.Conectando a los compiladores de Java

El Annotation Processing API proporciona muchas de las características deseadas (descubrimiento de servicio automático, compatible con Eclipse). Desafortunadamente, esto está dirigido a los generadores de código y doesn't support manipulation of existing artefacts:

Las entradas iniciales a la herramienta son considerados a ser creado por el cero redonda; por lo tanto, intentar crear un archivo de fuente o clase correspondiente a una de esas entradas dará como resultado FilerException.

El patrón Decorator recomendado por la API no es una opción.

Puedo ver cómo realizar el paso con un agente/instrumentación en tiempo de ejecución, pero esta es una opción peor que un paso de compilación manual ya que cualquier persona incluso tocada periféricamente por la API configuraría sus JVM de forma no obvia manera.

¿Hay alguna manera de conectar o ajustar el compiler tool invocado por javac? ¿Alguien ha subvertido con éxito los procesadores de anotación para manipular bytecode, sin importar lo que diga el documento?

Respuesta

4

El compilador Groovy es el único compilador de código de bytes que permite enganchar en el proceso de compilación (ejemplo: Generate bytecode to support the Singleton pattern)

La API de procesamiento de anotación no está destinado a cambiar el código. Como ya ha descubierto, todo lo que puede hacer es instalar un cargador de clases, examinar el bytecode en tiempo de ejecución y manipularlo. Es un cerebro muerto, pero funciona. Esto sigue el tema general "tememos que un desarrollador pueda intentar algo estúpido" que encontrará en Java. No hay forma de extender javac. Las clases relevantes son privadas, finales o cambiarán con la próxima versión de Java.

Otra opción es escribir Java anotado, por ejemplo, se escribe una clase "ExampleTpl.java". Luego, usa un precompilador que expande las anotaciones en ese archivo para obtener "Example.java". En el resto del código, usa Example e ignore ExampleTpl.

Para Eclipse, hay un bug report to automate this step. No estoy al tanto de ningún otro trabajo en esta área.

3

Se puede hacer.

Eche un vistazo a la publicación de mi blog Roman Numerals, in our Java donde se utiliza un procesador de anotaciones para reescribir el código. La limitación es que solo funciona con javac de Sun.

+0

Tu enlace está muerto. –

Cuestiones relacionadas