Ich versuche, einen Annotationsprozessor mit Java zu schreiben. Dieser Annotationsprozessor muss annotierte verschachtelte Klassen in einer annotierten Klasse identifizieren (siehe unten). Ich werde die annotierten Klassen zuerst bearbeiten und dann ihre inneren Anmerkungen verarbeiten. Dies wird zur Kompilierzeit durchgeführt, und ich werde keine Kenntnis von der Klasse haben, die gerade verarbeitet wird. Es ist möglich, mehrere geschachtelte Klassen innerhalb von Foo zu haben. Wie verarbeite ich die Annotationen aller dieser verschachtelten Klassen.APT Wie man Anmerkungen von verschachtelten annotierten Klassen verarbeitet
@MyAnnotation(value="Something important")
public class Foo
{
private Integer A;
@MyMethodAnnotation(value="Something Else")
public Integer getA() { return this.A; }
@MyAnnotation(value="Something really important")
private class Bar
{
private Integer B;
@MyMethodAnnotation(value="Something Else that is very Important")
public Integer getB() { return this.B }
}
}
Wie kann ich Zugriff auf die verschachtelten Bar Klasse erhalten, ist es Vermerk ‚MyAnnotation‘ und seine ‚MyMethodAnnotation‘ während der Verarbeitung? Der folgende Code gibt nur Informationen über die Klasse Foo aus. Wie kann ich Informationen über die Bar verarbeiten?
for (Element element : env.getElementsAnnotatedWith(MyAnnotation.class)) {
if (element.getKind().equals(ElementKind.CLASS))
{
System.out.println(element.getKind().name() + " " + element.getSimpleName());
processInnerClassElement(element);
}
else
{
System.out.println(element.getKind().name() + " " + element.getSimpleName());
}
}
...
private void processInnerClassElement(Element element)
{
for (Element e : element.getEnclosedElements())
{
if (e.getKind().equals(ElementKind.CLASS))
{
System.out.println(e.getKind().name() + " " + e.getSimpleName());
processInnerClassElement(e);
}
else
{
System.out.println(e.getKind().name() + " " + e.getSimpleName() );
}
}
}
Ich versuche den Zugriff auf ein Element auf der Bar verschachtelten Klasse für (Element e: env.getElementsAnnotatedWith (EmfInfo.class)) unter Verwendung { aber dies gibt nur die äußersten Klasse Foo. – sholmes