Obtener campos de clase del objeto anotada en el procesador de anotación

Lucas:

estoy trabajando en mi primer procesador de anotación. Estoy intentando conseguir campos de la clase a través de la anotación en el objeto declarado (que es un campo de un método). Por ejemplo:

public class Person {
    private String name;
    private String surname;
}

...
public void myMethod(@MyAnnotation Person person) { 
    /*...*/
}
...

A través de @MyAnnotation quiero conseguir 'nombre' y los campos de nombre '.

¿Es eso posible? Hice algo de parecido con el campo del método:

...
for (Element element : roundEnvironment.getElementsAnnotatedWith(AnnotationOnMethod.class)) {
    ExecutableElement method = (ExecutableElement) element;
    List<? extends VariableElement> parameters = method.getParameters();
    parameters.forEach(p -> {
        /*code here for parameter*/
    });
}
...

Gracias de antemano, Luca.

Solución: Para mi solución Estoy asumiendo que la anotación es el método y no el parámetro del método. La respuesta correcta a la pregunta es la respuesta Publicado por rjeeb. Se puede ver a continuación.


Set<? extends Element> elements = roundEnvironment.getElementsAnnotatedWith(AnnotationOnMethod.class);
for (Element element : elements) {
    ExecutableElement executableElement = (ExecutableElement) element; 
    List<? extends VariableElement> parameters = executableElement.getParameters();
    for (VariableElement parameter : parameters) {
        DeclaredType declaredType = (DeclaredType) parameter.asType();
        TypeElement clazz = (TypeElement) declaredType.asElement();
        clazz.getEnclosedElements().forEach(o -> {
                if (o.getKind().isField()) {
                    log.info("Simple name of field: " + o.getSimpleName());
                }
        });
    }
}
rjeeb:

Su anotación es de tipo ElementType.PARAMETERpor lo que una vez que el elemento que anota con él, entonces debe ser TypeElementy por lo tanto se puede obtener los campos de este tipo de elemento

for (Element element : roundEnv.getElementsAnnotatedWith(AnnotationOnMethod.class)) {
    TypeElement typeElement = elementUtils.getTypeElement(element.asType().toString());
    Set<? extends Element> fields = typeElement.getEnclosedElements()
            .stream()
            .filter(o -> o.getKind().isField())
            .collect(Collectors.toSet());

    // do something with the fields
}

usted puede conseguir las clases de ayuda de la AbstractProcessor

private Messager messager;
private Types typeUtils;
private Elements elementUtils;

@Override
public synchronized void init(ProcessingEnvironment processingEnv) {
    messager = processingEnv.getMessager();
    typeUtils = processingEnv.getTypeUtils();
    elementUtils = processingEnv.getElementUtils();
}

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=331707&siteId=1
Recomendado
Clasificación