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

lap*_*ots 1 java static annotations

之前处理的是什么 - static阻止或annotation

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

@CustomAnnotation
class TemplateClass {
    static {}
}
Run Code Online (Sandbox Code Playgroud)

class有一些annotationstatic块.

Tho*_*mas 6

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

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

TemplateClass.class.isAnnotationPresent( CustomAnnotation.class );
Run Code Online (Sandbox Code Playgroud)

在这里TemplateClass,如果它有没有在这段静态块将被执行将首先被加载.然后,在访问加载的类对象之后,通过检查注释是否存在于该类并采取适当的操作来"处理"注释.

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

存在为"过程"注释静态块之前,但是一种方法:它们可以在编译时由注释处理器或甚至编译器处理中,如果知道那些注释.@Deprecated就是这样的一个例子.

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