0

我想从声明的注释中的静态字段中获取值。例子:

@TestAnnotation
const val MY_CUSTOM_FIELD = "test123"

我想获得“test123”作为价值。

到目前为止,我可以这样获得名称和种类Element

for (element: Element in environment?.getElementsAnnotatedWith(TestAnnotation::class.java)!!) {
   if (element.kind != ElementKind.FIELD) {
      messager?.error("@TestAnnotation must be applied to field")
      return true
   }
   val typeMirror = element.asType()
   messager?.error(elements?.getName(element.simpleName).toString()) // this prints MY_CUSTOM_FIELD
   messager?.error(typeMirror.toString()) // this prints java.lang.String
}

是否有可能以某种方式获得“test123”?

4

1 回答 1

2

您可以使用VariableElement#getConstantValue()

final如果这是一个初始化为编译时常量的字段,则返回此变量的值。null否则返回。该值将是原始类型或String. 如果该值是原始类型,则将其包装在适当的包装类(例如Integer)中。

请注意,并非所有final字段都具有恒定值。特别是,enum常量被视为编译时常量。要具有常量值,字段的类型必须是原始类型或String.

返回:如果这是一个初始化为编译时常量的字段,则返回
此变量的值,否则finalnull

请参阅Java 语言规范
15.28 常量表达式
4.12.4 最终变量

您必须ElementVariableElement. 例如:

for (element: Element in environment?.getElementsAnnotatedWith(TestAnnotation::class.java)!!) {
   if (element.kind != ElementKind.FIELD) {
      messager?.error("@TestAnnotation must be applied to field")
      return true
   }
   val constant = (element as VariableElement).constantValue;
}

请注意,由于element.kind == ElementKind.FIELD演员表VariableElement将起作用。

于 2020-01-28T14:01:44.997 回答