从注释处理器中的带注释对象获取类字段

时间:2019-09-19 15:05:07

标签: java reflection annotations annotation-processing java-annotations

我正在使用我的第一个注释处理器。我试图通过声明的对象(这是方法的字段)上的注释获取类的字段。 例如:

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

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

我想通过@MyAnnotation获取“姓名”和“姓氏”字段。

有可能吗?我对方法的字段做了类似的操作:

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

谢谢,卢卡。

解决方案: 对于我的解决方案,我假设注释是在方法上,而不是在方法的参数上。我的问题的正确答案是rjeeb发布的答案。您可以在下面看到它。


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());
                }
        });
    }
}

1 个答案:

答案 0 :(得分:2)

您的注释的类型为ElementType.PARAMETER,因此,一旦获得带有注释的元素,则其应该为TypeElement,因此您可以获取此类型元素的字段

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
}

您可以从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();
}