Kotlin自定义属性注解未被识别问题求助
问题原因与解决方法
你调用Student::class.annotations拿不到注解的核心原因是:这个API仅返回直接标注在类本身上的注解,而你的@AltArg是标注在类的成员属性上的,自然不在这个集合里。另外还有一个容易忽略的点:Kotlin注解默认的保留策略是AnnotationRetention.SOURCE(仅在源码阶段保留,编译后丢弃),如果要在运行时通过反射获取注解,必须显式指定保留策略为RUNTIME。
步骤1:修正注解的保留策略
首先修改你的AltArg注解类,添加@Retention(AnnotationRetention.RUNTIME),确保注解能在运行时被反射读取:
@Retention(AnnotationRetention.RUNTIME) @Target(AnnotationTarget.PROPERTY) annotation class AltArg(val name: String)
步骤2:正确获取属性上的注解
通过Kotlin反射API遍历类的成员属性,逐个查找属性上的@AltArg注解:
fun main() { // 获取Student类的所有成员属性 val memberProperties = Student::class.memberProperties // 遍历属性,提取AltArg注解 memberProperties.forEach { property -> val altArg = property.findAnnotation<AltArg>() altArg?.run { println("属性 ${property.name} 对应的AltArg名称:$name") } } }
运行这段代码,就能正确输出每个标注了@AltArg的属性对应的注解信息了。
补充说明
KClass.memberProperties:返回类的所有成员属性(包括主构造函数中声明的val/var)。KProperty.findAnnotation<T>():Kotlin反射提供的扩展函数,专门用于查找属性上的指定注解,找不到时返回null。
内容的提问来源于stack exchange,提问作者ARainyCloud
相关产品推荐
相关产品推荐

