使用反射无法获取Kotlin重写方法上的Java继承注解问题求助
使用反射无法获取Kotlin重写方法上的Java继承注解问题求助
嗨,我来帮你捋清楚这个问题~
首先得明确一个关键知识点:你用的@Inherited注解只对类级别的注解生效,它根本不会处理方法、字段这类成员上的注解!这是Java注解的原生规则,不管你是在Java还是Kotlin里用,都得遵守这个限制。
你现在的场景是把@JavaAnnotation标注在了接口的方法上,然后让Kotlin类重写了这个方法,这时候@Inherited完全起不到“继承方法注解”的作用,所以反射获取实现类方法的注解时自然是空数组。
那怎么解决这个问题呢?这里给你一个实用的方案:自己写个工具方法,手动遍历父接口的方法来查找对应的注解。
解决方案示例
先写一个扩展函数,用来从当前方法的父接口中查找目标注解:
import kotlin.reflect.KFunction fun KFunction<*>.findAnnotationFromParentInterfaces(): JavaAnnotation? { // 先检查当前方法本身有没有注解 this.annotations.forEach { if (it is JavaAnnotation) return it } // 遍历当前类的所有父接口,找同名同参数的方法 val declaringClass = this.returnType.classifier as? Class<*> ?: return null declaringClass.interfaces.forEach { interfaceClass -> val interfaceMethod = interfaceClass.declaredMethods.find { it.name == this.name && it.parameterCount == this.parameters.size } ?: return@forEach // 检查接口方法上的注解 interfaceMethod.getAnnotation(JavaAnnotation::class.java)?.let { return it } } return null }
然后修改你的测试代码,用这个方法来查找注解:
@Test internal fun shouldFindAnnotationFromParentInterface() { val myClass = MyClass() val method = myClass::class.declaredFunctions.find { it.name == "method" }!! val annotation = method.findAnnotationFromParentInterfaces() Assertions.assertTrue(annotation != null) }
补充说明
如果后续你可以调整注解的定义,哪怕换成Kotlin注解,也要注意:Kotlin的@Inherited同样只针对类级别生效,方法层面的注解继承还是得靠手动遍历父类/父接口的方式来实现,这是目前JVM反射模型的限制哦。
备注:内容来源于stack exchange,提问作者Captain_spack_jarrow
相关产品推荐
相关产品推荐

