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