一方面,存在@NonNull
,Oracle对此表示“编译器可以确定代码路径可以接收空值而无需调试NullPointerException
的情况”。因此,我想它是在编译时处理的。
另一方面,有@Inject
,它注入构造函数,方法和字段,而不管它们的访问修饰符如何。因此,我想它们是在运行时处理的。
使我困惑的另一件事是,即使它们是私有的,也可以在运行时注入这些字段。这是否意味着具有@Inject
的字段必须具有setter?
最佳答案
它完全取决于the runtime retention policy of the annotation。
例如,@Inject
注释的保留策略为RUNTIME
;这意味着正在运行的代码可以检查此类注释并对其进行操作(如名称所示,此处通过“注入”值)。
我不特别了解@NonNull
,但是它的工作方式可能与JSR 305中的@Nonnull
相同,后者的保留策略为CLASS
。例如,它在诸如FindBugs之类的工具中用于执行字节码分析,并在检测到由此注释的元素的滥用时发出警告。
最后,@Override
是具有SOURCE
保留策略的注释的示例,编译器可以使用它来确定代码是否滥用了注释并引发编译失败。