Невозможно получить аннотацию из поля класса данных - PullRequest
0 голосов
/ 06 мая 2019

Я хочу создать собственный анализатор запросов, я хочу сделать это путем аннотирования полей и получения значения по отражению, но я могу получить аннотацию только из поля класса, приведенный ниже код не работает для класса данных или конструктора в классе Любая идея, что не так?

open class RequestParser {


fun getRequestWithTag(): String {
    var requestString = "<RequestData>"

    val declaredMemberProperties = this::class.declaredMemberProperties

    declaredMemberProperties.filter {
        it.findAnnotation<RequestField>() != null
    }.forEach { filteredMemberProperties ->
        requestString += "<${filteredMemberProperties.name.firstLetterToUpperCase()}>${filteredMemberProperties.getter.call(this)}</${filteredMemberProperties.name.firstLetterToUpperCase()}>"
    }

    requestString += "</RequestData>"
    return requestString
}
}



@Retention(AnnotationRetention.RUNTIME)
@Target(
    FIELD,
    PROPERTY,
    PROPERTY_GETTER,
    VALUE_PARAMETER,
    PROPERTY_SETTER,
    CONSTRUCTOR,
    FUNCTION)
public annotation class  RequestField




//model example
data class RequestTest(
  @RequestField val name: String
) : RequestParser()


//using example
RequestTest("name").getRequestWithTag()

1 Ответ

0 голосов
/ 06 мая 2019

Атрибут в конструкторе класса данных - это много вещей, параметр конструктора, геттер, сеттер и поле. Поэтому вам нужно установить цели использования сайта, чтобы выразить то, что вы на самом деле имеете в виду.

class Example(@field:Ann val foo,    // annotate Java field
              @get:Ann val bar,      // annotate Java getter
              @param:Ann val quux)   // annotate Java constructor parameter

См. Также https://kotlinlang.org/docs/reference/annotations.html#annotation-use-site-targets

Так что в вашем случае я бы попробовал следующее:

data class RequestTest(
  @property:RequestField val name: String
) : RequestParser()

С property Я могу получить аннотацию от this::class.declaredMemberProperties

Если вы поставите field, вы сможете получить его через this::class.java.declaredFields

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