一方面有@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