何时处理Java注释?

时间:2016-08-24 07:30:47

标签: java annotations

一方面有@NonNull,Oracle称之为#34;编译器可以确定代码路径可能接收空值的情况,而无需调试NullPointerException。 &#34 ;.所以,我想它是在编译时处理的。

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

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

1 个答案:

答案 0 :(得分:4)

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

例如@Inject注释的保留政策为RUNTIME;这意味着运行代码可以检查这些注释并对它们采取行动(这里通过“注入”值,顾名思义)。

我不是特别了解@NonNull,但它可能与JSR 305的@Nonnull一样,其保留政策为CLASS。例如,它在FindBugs等工具中用于执行字节码分析,并产生警告,其中检测到滥用注释元素。

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