Java 在注释处理环境中获取静态初始值设定项

Java 在注释处理环境中获取静态初始值设定项,java,annotations,annotation-processing,Java,Annotations,Annotation Processing,下面是来自javax.lang.model.element.ExecutableElement.getSimpleName()的javadoc 返回构造函数、方法或初始值设定项的简单名称。对于 构造函数,返回名称“init”,对于静态 初始值设定项,返回名称“clinit”,对于匿名 类或实例初始值设定项,则返回空名称 请注意,粗体部分表示对于静态初始化器,它意味着可执行元素可以表示静态初始化器 那个么,如何在注释处理环境中获得静态初始化器呢?此外,这是否意味着我们可以在静态块上添加注释(尽管在

下面是来自
javax.lang.model.element.ExecutableElement.getSimpleName()的javadoc

返回构造函数、方法或初始值设定项的简单名称。对于 构造函数,返回名称“init”,对于静态 初始值设定项,返回名称“clinit”,对于匿名 类或实例初始值设定项,则返回空名称

请注意,粗体部分表示
对于静态初始化器
,它意味着
可执行元素
可以表示
静态初始化器


那个么,如何在注释处理环境中获得静态初始化器呢?此外,这是否意味着我们可以在静态块上添加注释(尽管在java8之前我们不能)?

您不能对静态初始化器进行注释。但你仍然可以访问它

表示中的所有元素都可用,无论您如何访问它

例如,如果您注释一个包含静态初始值设定项的类,您将得到它的
TypeElement
表示,并且您可以使用
getEncloseElements()
获得所有字段、方法、构造函数和初始值设定项

在循环中,您可以测试元素的类型。 对于静态初始值设定项使用:

element.getKind() == ElementKind.STATIC_INIT
例如,使用初始值设定项

element.getKind() == ElementKind.INSTANCE_INIT
现在一个重要的问题是,你到底需要实现什么。如何使用初始值设定项

如果您在注释处理期间访问它,您可能会发现,有一个初始值设定项,但基本上就是这样。例如,主体表示不可用


如果要检查初始值设定项的主体,必须使用Java 8中引入的编译器插件API,使用
TaskListener

IIUC,静态初始值设定项可以是可执行元素,但不是方法;因此,您不能附加批注。@daniu是的,但我如何获得任何静态阻止程序?@DeanXu我不熟悉批注处理API,但如果您在静态块中有一些局部类,或者只是带有批注的变量,该怎么办?也许会有一些方法来获取声明局部类/变量的位置,就像普通方法中的局部类一样。(与来自法线反射的GetEnclosuringMethod类似,但不支持cinit方法)