之前已处理的内容 - static
阻止或annotation
?
例如,像这样处理类的顺序是什么
@CustomAnnotation
class TemplateClass {
static {}
}
其中,类有annotation
和static
块。
答案 0 :(得分:6)
这些是以不同方式处理的,因此没有特定的顺序。注释只保存在类元数据(反射)中,需要通过反射代码访问,而静态块在类本机加载类本身时执行。那说反射只能在加载类之后才能访问注释,因此你可以说首先执行静态块(除非你在其中做了一些邪恶的反射,在这种情况下我不确定)会发生什么 - 你甚至可能会破坏应用程序 - 每次你做这样的事情时,一只小猫会死掉;))。
作为一个例子,考虑一下这就是你如何处理"注释:
TemplateClass.class.isAnnotationPresent( CustomAnnotation.class );
如果尚未加载TemplateClass
,则首先加载@Deprecated
,并且在此期间将执行静态块。然后,在您访问加载的类对象后,注释将被处理"通过检查该类是否存在并采取适当的行动。
编辑:如@fabian所评论,您可以在静态块内执行上面的行,它应该可以正常工作。也就是说,更正确的答案可能是:静态块仍将首先执行,但执行不会完成,直到注释已被处理"。
是一种方式来处理"但是,静态块之前的注释:如果它知道这些注释,它们可以在编译时由注释处理器甚至编译器处理。 validateValue
就是一个例子。
说明何时以及如何处理注释不依赖于注释本身,而是依赖于使用它的代码。