2016-08-24 165 views
1

一方面有@NonNull,對此Oracle表示「編譯器可以確定代碼路徑可能接收空值的情況,而無需調試NullPointerException」。所以,我想它是在編譯時處理的。何時處理Java註釋?

另一方面有@Inject,它會注入構造函數,方法和字段,而不管它們的訪問修飾符如何。所以,我想他們是在運行時處理的。

讓我困惑的還有一件事是即使它們是私有的,也可以在運行時注入這些字段。這是否意味着有@Inject的字段必須有setter?

回答

3

完全取決於the runtime retention policy of the annotation

例如@Inject註釋的保留策略爲RUNTIME;這意味着運行代碼可以檢查這些註釋並對它們執行操作(這裏通過「注入」值,如名稱所示)。

我不知道具體關於@NonNull,但它可能與JSR 305中的@Nonnull相同,其保留策略爲CLASS。它用於諸如FindBugs之類的工具來執行字節碼分析,並且在檢測到濫用如此註釋的元素時產生警告。

最後,@Override是帶有SOURCE保留策略的註釋示例,編譯器可以使用它來確定代碼濫用註釋並引發編譯失敗。

+0

而對於訪問私人領域的問題,我找到了答案[這裏](http://stackoverflow.com/questions/1196192/how-do-i-read-a-private-field-in-java)。謝謝。 – gicig