使用 kotlinpoet-metadata 从构造函数值参数获取注释
Getting annotation from constructor value parameter using kotlinpoet-metadata
我有这样的数据class
@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
,我也得到了空列表
提前致谢!
注释只有在没有其他地方可以存储时才会存储在元数据中。对于参数,您必须直接从 Parameter
(反射)或 VariableElement
(元素 API)读取它们。这就是为什么我们有 ClassInspector
API。除了基本 class 数据之外,您几乎不想尝试读取任何其他内容。字节码或元素中已经包含的任何内容基本上也永远不会复制到元数据中。将元数据视为添加的信号,而不是批量替换。
我有这样的数据class
@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
提前致谢!
注释只有在没有其他地方可以存储时才会存储在元数据中。对于参数,您必须直接从 Parameter
(反射)或 VariableElement
(元素 API)读取它们。这就是为什么我们有 ClassInspector
API。除了基本 class 数据之外,您几乎不想尝试读取任何其他内容。字节码或元素中已经包含的任何内容基本上也永远不会复制到元数据中。将元数据视为添加的信号,而不是批量替换。