Получение аннотации значения enum - PullRequest
0 голосов
/ 04 мая 2020

Я знаю, как получить аннотацию значения перечисления в Java. Однако Kotlin имеет свою собственную библиотеку отражений, и я считаю, что должен быть лучший способ сделать эту работу. Может кто-нибудь опубликовать пример.

Просто чтобы уточнить c давайте определим класс enum

enum class Enum {
    @SerialName("constant")
    Constant
}

Мне нужна функция f(e: Enum): String, чтобы f(Enum.Constant) == "constant".

Ответы [ 2 ]

1 голос
/ 04 мая 2020

Вы можете использовать аналогичный подход с java, получив поле по имени и затем обратившись к аннотации, используя класс аннотации.

Так что, если у вас есть определения классов перечисления и аннотации ниже;

enum class Enum {
 @SerialName("constant")
 Constant
}

annotation class SerialName(val value: String)

Тогда вы можете определить нижеприведенную функцию и вызвать ее, как показано ниже;

fun getAnnotationValue(enum:Enum):String = enum.declaringClass.getField(enum.name).getAnnotation(SerialName::class.java).value

fun main(args: Array<String>) {
 println(getAnnotationValue(Enum.Constant))
}

Hope это помогает.

1 голос
/ 04 мая 2020

Я провел небольшое исследование, но, похоже, в библиотеке отражений * 1009 это не поддерживается. Фактически, я обнаружил, что линтер даже не правильно предлагает цель аннотации FIELD для вашей аннотации, если вы даете ей ту, которая не работает для значений Enum, и вместо этого неправильно предлагает автоматически добавить цель CLASS .

Проблема в том, что значения Enum в основном представляют собой поля c, которые не существуют в Kotlin, за исключением классов Enum. И классы отражения, кажется, не предоставляют способ доступа к этому особому случаю.

Однако я изо всех сил пытаюсь найти вариант использования для аннотаций значений Enum, которые не могут быть решены с помощью свойств в Enum конструктор (ы).

enum class MyEnum(val someConstant: String? = null) {
    SomeValue("myConstant")
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...