如何从ExecutableElement获取方法体

时间:2016-07-29 11:06:16

标签: java methods annotation-processing

在我的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的一部分。如果您编写的代码依赖于此,您需要自担风险。此代码及其内部接口如有更改或删除,恕不另行通知。

我希望可以在更通用的注释处理框架中访问带注释的方法体。

1 个答案:

答案 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