2017-02-28 92 views
0

予本文(https://www.javacodegeeks.com/2015/01/how-to-process-java-annotations.html),該註釋處理具有多個輪中讀:註釋處理編譯步驟

註釋處理在獨立的階段發生,稱爲輪。在每一輪中,處理器都有機會處理它感興趣的註釋。

通過傳遞給process()方法的RoundEnvironment參數,可以處理註釋和它們出現的元素。

如果註釋處理器在一輪中生成新的源文件或類文件,那麼編譯器將使這些文件在下一輪中可供處理。這一直持續到不再生成新文件。

上一輪不包含任何輸入,因此是發佈處理器可能獲得的任何資源的好機會。

有人可以向我解釋什麼是輪迴?例如,假設我們有一個註釋Metrics.java,當編譯器通過java源代碼解析時,它將首先找到所有使用此註釋的元素,然後在編譯結束時運行該註釋的註釋過程,其中傳入的RoundEnvironment將包含所有具有Metrics註釋的元素?

或者任何時候編譯器看到一個註釋,它將立即運行註釋,如果它的保留類型爲ClassSource。否則,由於它的保留類型爲Runtime,它將不會運行該註釋直到運行時爲止?

+0

據我所知,編譯器從來沒有看到註釋。它們在編譯器看到它們之前由註釋處理器處理。 –

回答

0

據我瞭解,解析java文件編譯器會收集所有註釋中的註釋,然後使用我們已經準備好的註釋處理器(第一輪)來處理它們。假設註釋處理器創建一個新的源文件(。 java),並在其中使用了註釋,此處編譯器會解析該文件並收集它的註釋,然後使用註釋處理器(第二輪)處理它們,並持續到最後一個java文件(通過註釋處理程序創建)我們沒有註釋。 和註解處理是我們應該要求啓用它的javac的一部分(我們有一些方法依賴於像maven,命令行,IDE等環境)。 註釋處理不會通過在源文件中滿足第一個註釋而立即運行,並且保留策略也不重要。