簡體   English   中英

Java自定義注解的Processor代碼什么時候調用? (運行時保留)

[英]When the Processor code of Java Custom Annotation is called? (runtime retention)

我知道自定義 Java 注釋需要一個帶有@interface的半接口聲明和一個處理器代碼(在某些文本中稱為消費者代碼),它定義了注釋背后的實際業務邏輯。 到目前為止很清楚,但我的問題是,處理器代碼在哪里/何時被調用,由誰調用 我的意思是,Java 編譯器是否會生成調用所有注釋處理器的代碼,例如,在類加載時? 或者程序員自己決定何時為他們的自定義注釋調用他們的處理器代碼? 例如, @GetMapping("/users")在某些方法上,告訴 servlet API 將請求映射到請求路徑中的 /users,應該傳遞給這個方法。 所以它在幕后有一些處理器,應該調用它來將這個映射配置存儲在某處,但是何時以及誰調用該處理器? 我想我的問題只對@Retention(RetentionPolicy.RUNTIME)的注釋@Retention(RetentionPolicy.RUNTIME) 謝謝

注釋處理器在編譯時運行。 調用javac ,用戶傳遞-processor命令行選項,然后javac調用處理器。 注釋處理器可以發出錯誤、創建文件(包括 Java 代碼文件),甚至修改現有代碼。 除了上面鏈接的 Oracle 文檔之外,您可能還想查看教程,例如Baeldung 的.

有些框架直接解釋注解,所以不需要自己編寫注解處理器。

為了影響運行時行為,您的代碼可以反射性地讀取注釋; 在這種情況下,在編譯時沒有運行注釋處理器。

顧名思義, Annotation是附加信息(或行為)。 默認情況下,此信息不會被處理或用於改變任何行為。 必須有一些實體來處理注釋。

保留策略告訴 Java 編譯器注釋的范圍。 即,是否需要在運行時或編譯時處理額外信息。

對於編譯時處理, annotation processors使用-processor標志連接到編譯過程中。 對於運行時處理,反射(例如this )用於訪問附加信息。

@GetMapping("/users") 在某些方法上,告訴 servlet API 將請求映射到請求路徑中的 /users,

僅注釋的存在不會導致這種行為。 spring框架(簡化了很多)——

  • 將自身安裝為/*的 servlet 端點。 參見FrameworkServlet
  • 使用反射枚舉用GetMapping注釋的方法
  • 使用帶注釋的信息來填充 URL 到方法的映射。
  • 在處理請求時,使用映射路由到預期的方法。

理解流程的一個簡單技巧(是的,Java 有時太神奇了)是安裝斷點並查看調用堆棧。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM