online - Conectándose a los compiladores de Java
ejecutar codigo c online (2)
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.
La API de procesamiento de anotaciones proporciona muchas de las funciones deseadas (descubrimiento de servicio automático, compatible con Eclipse). Desafortunadamente, esto está dirigido a generadores de código y no admite la manipulación de artefactos existentes :
Las entradas iniciales a la herramienta se consideran creadas por la ronda zeroth; por lo tanto, intentar crear una fuente o archivo de clase correspondiente a una de esas entradas dará como resultado una 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 requeriría que cualquier persona incluso tocada periféricamente por la API configurara sus JVM de una manera no obvia.
¿Hay alguna manera de conectar o envolver la herramienta del compilador invocada por javac ? ¿Alguien ha subvertido con éxito los procesadores de anotación para manipular bytecode, sin importar lo que diga el documento?
El compilador de Groovy es el único compilador de códigos de bytes que permite engancharse en el proceso de compilación (ejemplo: Generar bytecode para admitir el patrón de Singleton )
La API de procesamiento de anotaciones no pretende 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 ignora ExampleTpl
.
Para Eclipse, hay un informe de errores para automatizar este paso . No estoy al tanto de ningún otro trabajo en esta área.
Se puede hacer.
Eche un vistazo a mi publicación en el blog Roman Numerals, en nuestra versión de Java, donde se utiliza un procesador de anotación para reescribir el código. La limitación es que solo funciona con javac de Sun.