Kotlin反射获取注解值失败:无法读取类属性的Header注解
问题原因及解决方案
你的问题出在注解的目标范围和反射对象不匹配:
- 你定义的
Header注解目标是AnnotationTarget.VALUE_PARAMETER,也就是构造函数参数; - 但反射代码是从类的成员属性(
SpecialRequestContext::class.members)中查找注解,而这些属性本身并没有被标注Header注解——注解实际挂在data class的构造函数参数上,所以属性的annotations集合为空,自然拿不到值。
两种解决办法
办法一:扩展注解的标注目标
修改Header注解的@Target,让它支持标注属性(同时保留构造函数参数的支持):
@Target(AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.PROPERTY) annotation class Header(val key: String)
这样你原来的反射代码就能正常获取到注解的key值,因为现在属性本身也被标注了该注解。
办法二:直接从构造函数参数中获取注解
如果不想修改注解的目标范围,可以直接遍历类的主构造函数参数,通过参数名关联到属性名:
private val wgKeys = SpecialRequestContext::class.primaryConstructor?.parameters?.associate { param -> param.name to param.annotations.find { it is Header }?.let { (it as Header).key } } ?: emptyMap()
由于data class的构造函数参数名和对应属性名完全一致,这样就能得到属性名与注解key的正确映射。
内容的提问来源于stack exchange,提问作者FailedUnitTest
相关产品推荐
相关产品推荐

