【问题标题】:Annotation Processing Compilation Steps注释处理编译步骤
【发布时间】:2017-07-19 21:48:29
【问题描述】:

我在这篇文章(https://www.javacodegeeks.com/2015/01/how-to-process-java-annotations.html) 中读到,Annotation Processing 有多个轮次:

注释处理发生在不同的阶段,称为轮次。在每一轮中,处理器都有机会处理它感兴趣的注释。

通过传递给 process() 方法的 RoundEnvironment 参数可以获得要处理的注释和它们所在的元素。

如果注释处理器在一轮中生成新的源文件或类文件,那么编译器将使这些文件可用于下一轮的处理。这种情况一直持续到不再生成新文件为止。

最后一轮不包含任何输入,因此是释放处理器可能已获取的任何资源的好机会。

有人可以向我解释一下回合是什么意思吗?例如,假设我们有一个注解 Metrics.java,当编译器解析 java 源代码时,它将首先找到使用该注解的所有元素,然后在编译结束时运行该特定 @987654323 的注解过程@注解,其中传入的RoundEnvironment将包含所有具有Metrics注解的元素?

或者,只要编译器看到一个注解,如果它的保留类型为ClassSource,它就会立即运行该注解。否则它不会在运行时运行该注解的注解,因为它的保留类型为Runtime?

【问题讨论】:

  • 据我了解,编译器永远不会看到注释。它们在编译器看到它们之前由注释处理器处理。

标签: java annotations


【解决方案1】:

据我了解,在解析 java 文件时,编译器会收集其中看到的所有注释,然后使用我们已经准备好的注释处理器(第一轮)处理它们。假设注释处理器创建一个新的源文件(.java )并在其中使用了注释,这里编译器用于解析该文件并收集其注释,然后使用注释处理器(第二轮)处理它们。这一直持续到最后一个java文件(是否通过注释处理器创建)我们里面没有注释。 注释处理是 javac 的一部分,我们应该要求启用它(我们有一些方法取决于环境,如 maven、命令行、IDE 等)。 注释处理不会通过满足源文件中的第一个注释来立即运行,并且保留策略也无关紧要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-19
    • 2017-03-01
    • 1970-01-01
    相关资源
    最近更新 更多