Получить значение поля stati c из аннотации - PullRequest
0 голосов
/ 28 января 2020

Я бы хотел получить значение из поля stati c из объявленной аннотации. Пример:

@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"?

1 Ответ

2 голосов
/ 28 января 2020

Вы можете использовать VariableElement#getConstantValue():

Возвращает значение этой переменной, если это поле final, инициализированное константой времени компиляции. Возвращает null в противном случае. Значение будет иметь тип примитива или String. Если значение имеет примитивный тип, оно помещается в соответствующий класс-оболочку (например, Integer).

Обратите внимание, что не все поля final будут иметь постоянные значения. В частности, enum константы не считаются константами времени компиляции. Чтобы иметь постоянное значение, тип поля должен быть либо примитивным, либо String.

Возвращает:
значение этой переменной, если это поле final инициализируется константой времени компиляции или null в противном случае

См. Java Спецификация языка :
15,22 Выражение константы
4.12.4 final Переменные

Вам придется разыграть Element до VariableElement. Например:

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 будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...