java - sirve - Anotación: leer el valor del elemento en tiempo de compilación
reflection en java (1)
No es la mejor respuesta ya que no he hecho esto yo mismo, pero viendo que han pasado 3 horas haré lo que pueda.
Descripción general del procesamiento de anotaciones
A menos que el proceso de anotación esté deshabilitado con la opción -proc: none, el compilador busca cualquier procesador de anotación que esté disponible. La ruta de búsqueda se puede especificar con la opción -processorpath; si no se proporciona, se utiliza la ruta de la clase de usuario. Los procesadores se ubican por medio de archivos de configuración del proveedor de servicios 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 se pueden especificar explícitamente, usando la opción -processor.
Por lo tanto, parece que necesita crear un archivo denominado javax.annotation.processing.Processor
en su carpeta META-INF/services
que enumera los nombres de sus procesadores de anotación, uno por línea.
EDITAR: 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 aquí .
¿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:
public @interface State {
String stage();
}
y anoto 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 etapa de elemento de anotación @ State 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;
}
}