如何读取Kotlin方法返回类型上标记的JsonObjectKey注解
问题根因
你无法通过Java反射API拿到返回类型上的JsonObjectKey注解,核心原因是Kotlin和Java对类型注解的存储规则不互通:
- 你定义的
JsonObjectKey虽然指定了Kotlin侧的AnnotationTarget.TYPE目标,但Kotlin编译器默认不会为这类注解生成Java侧的ElementType.TYPE_USE标记,JVM层面不会把这个注解识别为可以标注在类型使用位置的注解,自然不会被Java反射的AnnotatedType扫描到。 - 部分旧版本Kotlin编译器甚至不会把纯Kotlin的TYPE类注解写入Java原生的类型签名区,而是存在Kotlin专属的类元数据中,纯Java反射API完全读不到这部分内容。
可行解决方案
方案1:修改注解定义兼容Java反射
给JsonObjectKey补充Java侧的类型使用目标声明,显式指定运行时保留策略,修改后的注解定义如下:
// 显式声明运行时保留(Kotlin默认就是RUNTIME,显式写更稳妥) @Retention(AnnotationRetention.RUNTIME) @Target(AnnotationTarget.TYPE) // 补充Java层TYPE_USE目标,让JVM将注解写入类型签名 @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE_USE) annotation class JsonObjectKey(val name: String)
修改后重新编译代码,再调用method.annotatedReturnType.annotations就能拿到JsonObjectKey实例,读取name属性即可得到你要的key值。
注意:该方案在Kotlin 1.4+版本、JDK8及以上版本生效,旧版本环境存在兼容性问题,优先选方案2。
方案2:通过Kotlin反射读取(推荐,无兼容性问题)
不需要修改原有注解定义,引入Kotlin官方反射依赖即可直接读取元数据。
如果使用Gradle构建,先添加和你本地Kotlin版本完全一致的反射依赖:
dependencies { implementation("org.jetbrains.kotlin:kotlin-reflect:你的Kotlin版本号") }
读取注解的示例代码:
import kotlin.reflect.jvm.kotlinFunction import kotlin.reflect.full.findAnnotation // 这里的method是你持有的java.lang.reflect.Method实例 val kFunction = method.kotlinFunction ?: error("当前方法不是Kotlin声明的方法") val returnType = kFunction.returnType val jsonObjectKey = returnType.findAnnotation<JsonObjectKey>() // jsonObjectKey?.name 就是你需要的"key"值
拿到key值后,结合方法执行的返回结果,就能直接拼接生成{"key": "value"}结构的JSONObject。
内容的提问来源于stack exchange,提问作者Frank Neblung
相关产品推荐
相关产品推荐

