2016-07-29 22 views
3

In meinem AbstractProcessor Ich bin in der Lage zu bekommen alle Methoden aus einer Klasse mit einiger Anmerkung kommentiert zu bekommen, die ich geschaffen habe:Wie Methode Körper von ExecutableElement

List<? extends Element> allElements = processingEnv.getElementUtils().getAllMembers((TypeElement) bean); 
List<ExecutableElement> methods = ElementFilter.methodsIn(allElements); 

möglich ist, den Körper des Verfahrens zu erhalten/ExecutableElement? Die API scheint sich nur mit der Signatur und den Modifikatoren zu befassen.

ich wahrscheinlich eine Variante dieser Antwort verwenden könnte. https://stackoverflow.com/a/34568708/6095334, den Zugriff auf Klassen aus dem proprietären * .sun ** Paket, wie com.sun.tools.javac.tree.JCTree$MethodTree:

MethodTree methodTree = trees.getTree(executableElement); 

wo trees eine Instanz com.sun.source.util.Trees Satz ist in Die init() -Methode des AbstractProcessors als so: trees = Trees.instance(processingEnv);
Aber diese Klassen kommen mit einer Warnung: Dies ist nicht Teil einer unterstützten API. Wenn Sie Code schreiben, der davon abhängt, tun Sie dies auf eigenes Risiko. Dieser Code und seine internen Schnittstellen können ohne vorherige Ankündigung geändert oder gelöscht werden.

Ich hoffe, dass es möglich war, auf den Körper einer annotierten Methode aus dem allgemeineren Framework für die Annotationsverarbeitung zuzugreifen.

Antwort

3

Das Annotation-Framework unterstützt meines Wissens nicht den Zugriff auf einen ExecutableElement-Body. Es wäre verlockend sein getEnclosedElements() zu nennen, aber wie die javadoc Staaten:

Gibt die Elemente, die sind, lose, direkt umschlossen von diesem Element zu sprechen. Eine Klasse oder Schnittstelle umfasst die Felder, Methoden, Konstruktoren und Elementtypen, die sie direkt deklariert. Ein Paket umfasst die Klassen und Schnittstellen auf oberster Ebene, es wird jedoch nicht als Teil eines Unterpakets betrachtet. Andere Arten von Elementen werden derzeit nicht als Elemente betrachtet. Dies kann sich jedoch ändern, wenn sich diese API oder die Programmiersprache entwickelt.

Für mein Projekt gelang es mir, die Informationen, die ich von der Methode Körper benötigt, zu extrahieren, wie folgt:

MethodTree methodTree = trees.getTree(executableElement); 
BlockTree blockTree = methodTree.getBody(); 
for (StatementTree statementTree : blockTree.getStatements()) { 
    // *do something with the statements* 
} 

wo com.sun.source.util.Trees trees = Trees.instance(processingEnv); eine Instanz Feld I in der AbstractProcessor ‚s init() Methode festgelegt ist.

Siehe diese Antwort für Informationen über die Abhängigkeit zu den referenzierten jdk-Tool-Klassen: https://stackoverflow.com/a/29585979/6095334