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

Kotlin接口属性注解未同步到getter/setter 动态代理中无法读取如何解决

问题原因

Kotlin 中直接标注在属性上的注解,默认仅保留在 Kotlin 元数据的属性信息中,不会自动写入 JVM 字节码生成的 getter、setter 方法。JDK 动态代理基于 Java 反射读取方法上的注解,因此无法直接获取到属性上的注解。


解决方案

方案1:显式指定注解作用到 getter/setter 方法

标注属性时指定注解的使用位点目标,主动把注解写到 getter 和 setter 方法上,无需修改原有业务逻辑:

interface MyTestInterface {
    // 分别指定注解作用到属性的getter、setter方法
    @get:MyTestAnnotation("temp")
    @set:MyTestAnnotation("temp")
    var tempString: String
}

修改后直接在 InvocationHandler 中读取 method.declaredAnnotations 即可拿到注解。


方案2:通过 Kotlin 反射匹配属性读取注解

如果不想每个属性都重复标注注解,无需改动现有注解、属性的定义代码,直接在 InvocationHandler 中通过方法名反查对应 Kotlin 属性的注解即可:

注意:使用该方案需要引入 Kotlin 反射依赖:implementation "org.jetbrains.kotlin:kotlin-reflect:$你的Kotlin版本号"

private val invocationHandler = InvocationHandler { _, method, args ->
    Log.e("Called method:", method.name)
    val methodName = method.name
    // 从get/set方法名解析对应属性名
    val propName = when {
        methodName.startsWith("get") -> methodName.removePrefix("get").replaceFirstChar { it.lowercase() }
        methodName.startsWith("set") -> methodName.removePrefix("set").replaceFirstChar { it.lowercase() }
        else -> null
    }
    // 从接口的Kotlin属性中读取注解
    val annotation = propName?.let { name ->
        method.declaringClass.kotlin.memberProperties
            .find { it.name == name }
            ?.getAnnotation(MyTestAnnotation::class.java)
    }
    // 直接读取注解参数
    Log.e("注解text参数", annotation?.text ?: "无匹配注解")
    Log.e("args", args.size.toString())
}

该方案侵入性更低,适合已有大量属性标注了注解的场景。


内容的提问来源于stack exchange,提问作者OhhhThatVarun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 01:48:03