2016-08-24 117 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