2012-01-29 55 views
4

最近我一直在阅读有关注释,我有点困惑。我已经使用了注释@NotNull,但我真的不知道它是如何检查变量是否为空。没有在代码中的任何地方看到任何检查null的值。这是有道理的,因为它是一个接口,所以实际的处理发生在哪里,为什么不在代码中指定这个位置?我所见过的例子通常只是创建一个需要值的注释,但是没有做任何其他的事情,所以我对实现的发生地点感到困惑。注释处理在哪里发生?

回答

5

注释只是一个元数据,不多不少。 如果您想指定关于您在其上放置注释的类的一些细节。 认为它们(在某种程度上)是替代以前熟知的定义元数据的XML方法。

现在,很明显,有人读你的XML并运行代码,使元数据产生一些东西。注释也会发生同样的情况:注释所属的框架负责读取注释并对此信息进行处理。在@NotNull的情况下,它的hibernate-validator项目。 Java公开的API允许通过反射访问注释中的信息(类如java.lang.Class,Method,Field等)。因此,在Hibernate验证器内部的某个代码会传递给您的类,通过反射读取注释并检查该类是否遵守这些注释。 这些注释通常具有保留策略'运行时',这意味着它们被保存在字节码中并与携带这些注释的类一起加载。

还有一些应该由Java编译器处理的注释。像@Deprecated,@SuppressWarnings等等。拥有这种注释的好处是,您可以在编译阶段找到一些代码问题。

你也可以把注释处理器和'插件'在编译阶段,但它的完全不同的故事。

希望这个稍微澄清一下注释的用法