我在本文(https://www.javacodegeeks.com/2015/01/how-to-process-java-annotations.html)中读到了注释处理有多轮:
注释处理在不同的阶段进行,称为轮次。在每一轮中,处理器都有机会处理它感兴趣的注释。
要处理的注释及其存在的元素可通过传递给process()方法的RoundEnvironment参数获得。
如果注释处理器在一轮中生成新的源文件或类文件,那么编译器将使这些文件在下一轮中可用于处理。这将继续,直到不再生成新文件。
最后一轮不包含任何输入,因此是释放处理器可能获得的任何资源的好机会。
有人可以通过回合解释我的意思吗?例如,假设我们有一个注释Metrics.java
,当编译器通过java源代码进行解析时,它将首先找到使用此注释的所有元素,然后在编译结束时运行注释传入的Metrics
将包含具有RoundEnvironment
注释的所有元素的特定Metrics
注释的流程?
或者,只要编译器看到注释,它就会立即运行注释,如果它具有Class
或Source
的保留类型。否则,它将不会在运行时之前运行该批注的注释,因为它的保留类型为Runtime
?
答案 0 :(得分:0)
据我所知,解析java文件编译器时会收集其中的所有注释,然后使用我们已经准备好的注释处理器(第一轮)处理它们.suppose注释处理器创建一个新的源文件(.java并且在其中使用了注释,这里编译器用于解析该文件并收集其注释然后使用注释处理器(第二轮)处理它们。并且这一直持续到最后一个java文件(通过注释处理器创建或不通过)我们没有注释。 和注释处理是javac的一部分,我们应该要求它启用它(我们有一些方法依赖于环境,如maven,命令行,IDE等)。 通过在源文件中满足第一个注释,注释处理不会立即运行,而保留策略也无关紧要。