Generación de código en tiempo de compilación a partir del procesamiento de anotaciones | Un poco de Java


En determinadas ocasiones podemos tener la necesidad de generar
código en tiempo de compilación partiendo del procesamiento de
anotaciones.


Existen soluciones que ya nos permiten realizar esto, es el caso de Spring Roo.Por
ejemplo si anotamos una clase con la anotación @RooJavaBean, la consola
de Roo nos generará un aspecto que contendrá los getter y setter de los
atributos.


A partir de la versión 6,Java incorpora un nuevo API para el
procesamiento de Anotaciones que permite también generar código a partir
del procesamiento de anotaciones en tiempo de compilación.


Para implementar un procesador de anotaciones, es necesario crear una
clase que extienda de javax.annotation.processing.AbstractProcessor.
Esta clase la anotaremos con la anotación @SupportedAnnotationType
indicando la anotación/es que va a procesar el procesador


En nuestro ejemplo el procesador se encargará de procesar los
elementos anotados con la anotación @GenerateIdClients. El procesador
tendrá que implementar un método


Dentro de este método es donde se realizará el procesamiento de las anotaciones.El método recibe dos parámetros de entrada


  • Anotaciones que el procesador trata.En nuestro ejemplo sólo recibirá la anotación @GeneratedIdClients
  • El elemento de tipo RoundEnviroment será el que nos permite obtener todos los elementos anotados con una anotación especial
En este ejemplo se itera sobre el conjunto de anotaciones a procesar,
y por cada anotación se obtienen todos los elementos java que hacen uso
de esta anotación.


Toda clase de tipo AbstractProcessor tiene accesible la variable processingEnv (del tipo javax.annotation.processing.ProcessingEnvironment) que entre otras cosas :


  • Nos permite tener acceso a la clase para escribir mensajes por la consola :
  • Nos permite escribir ficheros



En este ejemplo se genera un aspecto que hace que nuestra clase
anotada implemente un interfaz y genera el método a implementar definido
en la interfaz


Una vez escrito y empaquetado en un jar el procesador , si queremos
aplicar sobre un proyecto para que procese las anotaciones y genere el
código, es necesario añadir en el pom.xml (partimos de la premisa de que el proyecto sobre el que vamos a trabajar es un proyecto Maven) el siguiente plugin


<plugin>
<groupId>org.bsc.maven</groupId>
<artifactId>maven-processor-plugin</artifactId>
<executions>
<execution>
<id>process</id>
<goals>
<goal>process</goal>
</goals>
<phase>generate-sources</phase>
<configuration>
<outputDirectory>src/main/java/</outputDirectory>
<processors>
<processor>com.demo.processors.ClientAnnotationProcessor</processor>
</processors>
</configuration>
</execution>
</executions>
</plugin>
Además en el pom.xml tiene que estar la dependencia de la libreria donde hemos empaquetado el jar