Kotlin中如何从父类获取子类重写函数的注解?
Kotlin中获取子类重写方法的注解可行,解决方案如下
你的代码场景:
abstract class Foo { abstract fun bar() fun baz() { println(this::bar.annotations) // 仅能获取父类抽象方法的注解,无法拿到子类的 } } class Qux : Foo { @Annotation override fun bar() { // ... } }
问题核心是this::bar指向的是父类中定义的抽象方法符号,而非子类重写后的方法,因此无法获取子类方法上的注解。要实现调用Qux#baz时打印@Annotation,可以用以下两种方式解决:
方式一:Kotlin反射实现
修改baz方法:
fun baz() { // 获取当前实例实际类型中名为"bar"的函数 val barFunction = this::class.members.first { it.name == "bar" } as KFunction<*> // 获取该函数的所有注解 val annotations = barFunction.annotations println(annotations) // 定位并判断特定类型的注解 val targetAnnotation = barFunction.findAnnotation<Annotation>() if (targetAnnotation != null) { println("找到目标注解:$targetAnnotation") // 直接用is判断注解类型 if (targetAnnotation is Annotation) { // 此处可添加自定义处理逻辑 } } }
方式二:Java反射实现
如果更习惯Java反射的写法,可改用:
fun baz() { // 获取当前实例实际类的bar方法 val barMethod = this.javaClass.getDeclaredMethod("bar") val annotations = barMethod.annotations.toList() println(annotations) // 获取指定类型的注解并判断 val targetAnnotation = barMethod.getAnnotation(Annotation::class.java) if (targetAnnotation != null) { println("找到目标注解:$targetAnnotation") if (targetAnnotation is Annotation) { // 此处可添加自定义处理逻辑 } } }
关于你提到的this::bar.javaClass.annotations的问题
这个写法拿到的是KFunction类本身的注解,并非你定义在方法上的@Annotation,属于完全不同的层面,自然无法用is判断目标注解类型,必须通过反射获取当前实例实际类的方法注解才是正确路径。
内容的提问来源于stack exchange,提问作者Melody
相关产品推荐
相关产品推荐

