You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 01:05:00