java处理注释和静态块的顺序

时间:2016-06-23 08:05:58

标签: java static annotations

之前已处理的内容 - static阻止或annotation

例如,像这样处理类的顺序是什么

@CustomAnnotation
class TemplateClass {
    static {}
}

其中,类有annotationstatic块。

1 个答案:

答案 0 :(得分:6)

这些是以不同方式处理的,因此没有特定的顺序。注释只保存在类元数据(反射)中,需要通过反射代码访问,而静态块在类本机加载类本身时执行。那说反射只能在加载类之后才能访问注释,因此你可以说首先执行静态块(除非你在其中做了一些邪恶的反射,在这种情况下我不确定)会发生什么 - 你甚至可能会破坏应用程序 - 每次你做这样的事情时,一只小猫会死掉;))。

作为一个例子,考虑一下这就是你如何处理"注释:

TemplateClass.class.isAnnotationPresent( CustomAnnotation.class );

如果尚未加载TemplateClass,则首先加载@Deprecated,并且在此期间将执行静态块。然后,在您访问加载的类对象后,注释将被处理"通过检查该类是否存在并采取适当的行动。

编辑:如@fabian所评论,您可以在静态块内执行上面的行,它应该可以正常工作。也就是说,更正确的答案可能是:静态块仍将首先执行,但执行不会完成,直到注释已被处理"。

一种方式来处理"但是,静态块之前的注释:如果它知道这些注释,它们可以在编译时由注释处理器甚至编译器处理。 validateValue就是一个例子。

说明何时以及如何处理注释依赖于注释本身,而是依赖于使用它的代码。