一方面,存在@NonNull,Oracle对此表示“编译器可以确定代码路径可以接收空值而无需调试NullPointerException的情况”。因此,我想它是在编译时处理的。

另一方面,有@Inject,它注入构造函数,方法和字段,而不管它们的访问修饰符如何。因此,我想它们是在运行时处理的。

使我困惑的另一件事是,即使它们是私有的,也可以在运行时注入这些字段。这是否意味着具有@Inject的字段必须具有setter?

最佳答案

它完全取决于the runtime retention policy of the annotation

例如,@Inject注释的保留策略为RUNTIME;这意味着正在运行的代码可以检查此类注释并对其进行操作(如名称所示,此处通过“注入”值)。

我不特别了解@NonNull,但是它的工作方式可能与JSR 305中的@Nonnull相同,后者的保留策略为CLASS。例如,它在诸如FindBugs之类的工具中用于执行字节码分析,并在检测到由此注释的元素的滥用时发出警告。

最后,@Override是具有SOURCE保留策略的注释的示例,编译器可以使用它来确定代码是否滥用了注释并引发编译失败。

09-26 05:36