一方面有@NonNull
,Oracle称之为#34;编译器可以确定代码路径可能接收空值的情况,而无需调试NullPointerException
。 &#34 ;.所以,我想它是在编译时处理的。
另一方面,有@Inject
,它注入构造函数,方法和字段,而不管它们的访问修饰符。所以,我想它们是在运行时处理的。
让我感到困惑的另一件事是,即使字段是私有的,也可以在运行时注入字段。这是否意味着@Inject
的字段必须具有setter?
答案 0 :(得分:4)
完全取决于the runtime retention policy of the annotation。
例如@Inject
注释的保留政策为RUNTIME
;这意味着运行代码可以检查这些注释并对它们采取行动(这里通过“注入”值,顾名思义)。
我不是特别了解@NonNull
,但它可能与JSR 305的@Nonnull
一样,其保留政策为CLASS
。例如,它在FindBugs等工具中用于执行字节码分析,并产生警告,其中检测到滥用注释元素。
最后,@Override
是带有SOURCE
保留策略的注释的示例,编译器可以使用它来确定代码是否滥用注释并引发编译失败。