一方面有@NonNull
,對此Oracle表示「編譯器可以確定代碼路徑可能接收空值的情況,而無需調試NullPointerException
」。所以,我想它是在編譯時處理的。何時處理Java註釋?
另一方面有@Inject
,它會注入構造函數,方法和字段,而不管它們的訪問修飾符如何。所以,我想他們是在運行時處理的。
讓我困惑的還有一件事是即使它們是私有的,也可以在運行時注入這些字段。這是否意味着有@Inject
的字段必須有setter?
一方面有@NonNull
,對此Oracle表示「編譯器可以確定代碼路徑可能接收空值的情況,而無需調試NullPointerException
」。所以,我想它是在編譯時處理的。何時處理Java註釋?
另一方面有@Inject
,它會注入構造函數,方法和字段,而不管它們的訪問修飾符如何。所以,我想他們是在運行時處理的。
讓我困惑的還有一件事是即使它們是私有的,也可以在運行時注入這些字段。這是否意味着有@Inject
的字段必須有setter?
完全取決於the runtime retention policy of the annotation。
例如@Inject
註釋的保留策略爲RUNTIME
;這意味着運行代碼可以檢查這些註釋並對它們執行操作(這裏通過「注入」值,如名稱所示)。
我不知道具體關於@NonNull
,但它可能與JSR 305中的@Nonnull
相同,其保留策略爲CLASS
。它用於諸如FindBugs之類的工具來執行字節碼分析,並且在檢測到濫用如此註釋的元素時產生警告。
最後,@Override
是帶有SOURCE
保留策略的註釋示例,編譯器可以使用它來確定代碼濫用註釋並引發編譯失敗。
而對於訪問私人領域的問題,我找到了答案[這裏](http://stackoverflow.com/questions/1196192/how-do-i-read-a-private-field-in-java)。謝謝。 – gicig