2011-06-15 17 views
6

¿Es posible leer el valor de un elemento de anotación en tiempo de compilación? Por ejemplo, si tengo la siguiente anotación definida:Anotación - Leer el valor del elemento en tiempo de compilación

public @interface State { 
    String stage(); 
} 

y anotar un método en una clase, así:

public class Foo { 
    @State(stage = "build") 
    public String doSomething() { 
     return "doing something"; 
    } 
} 

¿Cómo puedo leer el valor de la @ ¿Elemento de anotación de estado 'etapa' en tiempo de compilación, en un procesador de anotación? Tengo un procesador construido de la siguiente manera:

@SupportedAnnotationTypes(value = {"State"}) 
@SupportedSourceVersion(SourceVersion.RELEASE_6) 
public class StageProcessor extends AbstractProcessor { 
    @Override 
    public boolean process(Set<? extends TypeElement> elementTypes, 
      RoundEnvironment roundEnv) { 
     for (Element element : roundEnv.getRootElements()) { 
       // ... logic to read the value of element 'stage' from 
       // annotation 'State' in here. 
     } 
     return true; 
    } 
} 
+0

Si tiene un procesador de anotaciones, puede ejecutar apt (herramienta de procesamiento de anotaciones), pero supongo que la pregunta es, ¿qué quiere decir con tiempo de compilación? ¿Quieres decir cuando el código se compila? ¿Te refieres durante el proceso de construcción? ¿Necesita ayuda para invocar apt para cierta herramienta de compilación (por ejemplo, Eclipse, Ant, Maven, etc.)? – Pace

+0

Durante el proceso de compilación. En otras palabras, cuando se ejecutará el procesador de anotación. Además, no necesito ejecutar la herramienta apt ya que estoy usando java 6, que incluye soporte nativo para el procesamiento de anotaciones. – Joeblackdev

Respuesta

5

No es la mejor respuesta ya que no he hecho esto por mí mismo, pero viendo como ha sido 3 horas yo haré lo que pueda.

Visión general del proceso de anotación

A menos que el procesamiento de anotación es lesionados con la -proc: ninguna opción, los compilador busca los procesadores de anotación que están disponibles . La ruta de búsqueda puede ser especificada con la opción -processorpath ; si no se proporciona, se utiliza la ruta de clase de usuario . Los procesadores son ubicados por medio del servicio archivos de configuración de proveedor llamados
META-INF/services/javax.annotation.processing.Processor en la ruta de búsqueda. Dichos archivos deben contener los nombres de los procesadores de anotación que se utilizarán, enumerados uno por línea . Alternativamente, los procesadores pueden ser especificados explícitamente, usando la opción -processor.

lo que parece que es necesario crear un archivo llamado javax.annotation.processing.Processor en su carpeta META-INF/services que enumera los nombres de sus procesadores de anotación, uno por línea.

EDIT: Entonces creo que el código para leer las anotaciones sería algo así como ...

for (Element element : roundEnv.getRootElements()) { 
     State state = element.getAnnotation(State.class); 
     if(state != null) { 
      String stage = state.stage(); 
      System.out.println("The element " + element + " has stage " + stage); 
     } 
    } 

Un ejemplo del mundo real de un procesador de anotación se puede encontrar here.

+0

Gracias por la excavación. Estoy muy sorprendido de que aún no haya recibido una respuesta definitiva. Tengo los pasos configurados que describiste arriba. Lo que realmente necesito, sin embargo, es una forma de leer los elementos de anotación. – Joeblackdev

+0

Acceda directamente a los campos de la anotación. p.ej. String stage = state.stage(); –

Cuestiones relacionadas