2016-07-29 36 views
3

get方法的身體在我的AbstractProcessor我能夠得到一些註解一個類的所有方法,我已經創建了:如何從ExecutableElement

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

是有可能獲得該方法的身體/ ExecutableElement? API似乎只處理簽名和修飾符。

我大概可以用這個答案的一些變化:https://stackoverflow.com/a/34568708/6095334,訪問類從專有* **。孫包,如com.sun.tools.javac.tree.JCTree$MethodTree

MethodTree methodTree = trees.getTree(executableElement); 

其中treescom.sun.source.util.Trees集的一個實例AbstractProcessor的init()方法如下:trees = Trees.instance(processingEnv);
但是這些類帶有警告:這不是任何受支持的API的一部分。如果您編寫依賴於此的代碼,則需要您自擔風險。此代碼及其內部接口如有更改或刪除,恕不另行通知。

我希望能夠從更一般的註解處理框架內訪問註解的方法體。

回答

3

據我所知,註釋框架不支持訪問ExecutableElement的正文。這很有吸引力,請致電getEnclosedElements(),但作爲javadoc狀態:

返回鬆散地說,由此元素直接包圍的元素。類或接口被視爲包含它直接聲明的字段,方法,構造函數和成員類型。一個程序包包含其中的頂級類和接口,但不被視爲包含子程序包。其他類型的元素目前不被認爲包含任何元素;但是,隨着此API或編程語言的發展,這可能會發生變化。

我的項目,我設法提取我從法人體所需的信息如下:

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

其中com.sun.source.util.Trees trees = Trees.instance(processingEnv);是一個實例字段我在AbstractProcessorinit()方法設置。

查看此答案,瞭解與引用的jdk工具類有關的信息:https://stackoverflow.com/a/29585979/6095334