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
相关产品推荐
相关产品推荐

