在我的AbstractProcessor
我能够从带有注释的类中获取所有方法,我创建了:
List<? extends Element> allElements = processingEnv.getElementUtils().getAllMembers((TypeElement) bean);
List<ExecutableElement> methods = ElementFilter.methodsIn(allElements);
是否有可能获得方法/ ExecutableElement
的正文? API似乎只处理签名和修饰符。
我可以使用这个答案的一些变体:https://stackoverflow.com/a/34568708/6095334来访问专有* .sun。**包中的类,例如com.sun.tools.javac.tree.JCTree$MethodTree
:
MethodTree methodTree = trees.getTree(executableElement);
其中trees
是在AbstractProcessor的init()方法中设置的com.sun.source.util.Trees
实例,如下所示:trees = Trees.instance(processingEnv);
但是这些类带有警告:这不是任何受支持的API的一部分。如果您编写的代码依赖于此,您需要自担风险。此代码及其内部接口如有更改或删除,恕不另行通知。
我希望可以在更通用的注释处理框架中访问带注释的方法体。
答案 0 :(得分: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);
是我在AbstractProcessor
的{{1}}方法中设置的实例字段。
有关与引用的jdk工具类的依赖关系的信息,请参阅此答案:https://stackoverflow.com/a/29585979/6095334