Получение аннотации из параметра значения конструктора с использованием kotlinpoet-metadata - PullRequest
0 голосов
/ 26 апреля 2020

У меня есть такой класс данных

@Tagme("Response")
@TagResponse
data class Response(
    val id: Int,
    val title: String,
    val label: String,
    val images: List<String>,

    @Input(Parameter::class)
    val slug: Slug
)

Используя процессор аннотаций, я смог получить Response свойства, используя этот подход:

val parentMetadata = (element as TypeElement).toImmutableKmClass()

parentMetadata.constructors[0].valueParameters.map { prop ->

   // this will loop through class properties and return ImmutableKmValueParameter
   // eg: id, title, label, images, slug.

   // then, I need to get the annotation that property has here.
   // eg: @Input(Parameter::class) on slug property.

   // if prop is slug, this will return true.
   val isAnnotationAvailable = prop.hasAnnotations

   // Here I need to get the annotated value
   // val annotation = [..something..].getAnnotation(Input::class)
   // How to get the annotation? So I can do this:
   if ([prop annotation] has [@Input]) {
      do the something.
   }
}

Ранее я пытался получить аннотация вот так:

val annotations = prop.type?.annotations

Но я получил пустой список даже isAnnotationAvailable значение true

Заранее спасибо!

1 Ответ

0 голосов
/ 26 апреля 2020

Аннотации хранятся в метаданных только в том случае, если они нигде больше не могут быть сохранены. Для параметров вы должны прочитать их непосредственно из Parameter (отражение) или VariableElement (элементы API). Вот почему у нас есть ClassInspector API. Вам почти никогда не захочется читать что-либо, кроме базовых данных класса c. Все, что уже содержится в байт-коде или элементах, в основном также никогда не дублируется в метаданные. Обрабатывайте метаданные как дополнительный сигнал, а не как оптовую замену.

...