【问题标题】:Get static initializer in annotation processing environment在注解处理环境中获取静态初始化器
【发布时间】:2018-08-01 08:34:47
【问题描述】:

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

返回构造函数、方法或初始化程序的简单名称。为了 构造函数,返回名称“init”,对于静态 初始化器,返回名称“clinit”,并且对于匿名 类或实例初始化器,则返回一个空名称。

注意粗体部分是for a static initalizer,这意味着ExecutableElement可以代表static initalizer

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

【问题讨论】:

  • IIUC,静态初始化器可能是ExecutableElement,但不是方法;因此您不能附加注释。
  • @daniu 是的,但我怎样才能获得任何静态拦截器?
  • @DeanXu 我不熟悉注解处理 API,但是如果你有一些本地类,或者只是在静态块中带有注解的变量呢?也许然后有一些方法可以获取声明本地类/变量的位置,就像普通方法中的本地类一样。 (类似于普通反射的getEnclosureMethod,但不支持cinit方法)

标签: java annotations annotation-processing


【解决方案1】:

您不能注释静态初始化程序。但您仍然可以访问它。

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

例如如果你注释一个包含静态初始化器的类,你会得到它的TypeElement 表示,你可以使用getEnclosedElements() 得到所有的字段、方法、构造器和初始化器。

在循环中你可以测试元素的种类。 对于静态初始化器使用:

element.getKind() == ElementKind.STATIC_INIT

例如初始化器使用

element.getKind() == ElementKind.INSTANCE_INIT

现在一个重要的问题是,您到底需要实现什么。如何使用初始化器。

如果您在注解处理期间访问它,您可能会发现有一个初始化程序,但仅此而已。例如。身体表示不可用。

如果你想检查初始化器的主体,你必须使用 Java 8 中引入的编译器插件 API,使用 TaskListener

【讨论】:

    猜你喜欢
    • 2012-10-25
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-20
    • 1970-01-01
    • 2014-10-06
    • 1970-01-01
    相关资源
    最近更新 更多