注釈プロセッサに注釈付きオブジェクトからクラスのフィールドを取得します

ルーク:

私は私の最初の注釈プロセッサに取り組んでいます。私は(それが法の分野で)宣言されたオブジェクト上の注釈を通じてクラスのフィールドを取得しようとしています。例えば:

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

あなたの注釈は型である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();
}

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=331704&siteId=1