【问题标题】:How to get method body from ExecutableElement如何从 ExecutableElement 获取方法体
【发布时间】:2016-07-29 11:06:16
【问题描述】:

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

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

【问题讨论】:

    标签: java methods annotation-processing


    【解决方案1】:

    据我所知,注释框架不支持访问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

    【讨论】:

    • 我用 kapt(Kotlin 注释处理)尝试了这个,但是对于每个函数,如果函数返回 Unit(void),它只给出 1 个语句(return &lt;default value for return type&gt;)或 0 个语句。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-31
    • 2020-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多