1

我有这样的数据类

@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

提前致谢!

4

1 回答 1

2

只有在没有其他地方可以存储的情况下,注释才会存储在元数据中。对于参数,您必须直接从Parameter(reflection) 或VariableElement(elements API) 中读取它们。这就是我们拥有ClassInspectorAPI 的原因。您几乎从不想尝试读取基本类数据以外的任何内容。字节码或元素中已经包含的任何内容基本上也不会复制到元数据中。将元数据视为附加信号,而不是批发替代品。

于 2020-04-26T16:50:06.940 回答