给出以下代码:
interface MyInterface {
fun foo() {
// body
}
fun bar() {
// body
}
}
class MyInterfaceImpl: MyInterface {
override fun bar() {
// body
}
}
我需要在运行时知道bar()
被覆盖而foo()
没有被覆盖。如何使用反射来做到这一点?
注意:java.lang.reflect.Method#getDeclaringClass()
总是返回MyInterfaceImpl::class.java
,而java.lang.reflect.Method#isDefault()
总是返回false
。我在KClass
中找不到解决方案。
答案 0 :(得分:1)
据我所知,实现该可疑目标的两种方法是什么。
我将演示简单的一个,并在较困难的一个后面讨论想法。
简单的一种方法是简单地在方法上调用toString():
val functions = MyInterfaceImpl::class.functions
val bar = (functions.toList()[0])
val foo = (functions.toList()[2])
println(bar.toString()) // fun MyInterfaceImpl.bar(): kotlin.Unit
println(foo.toString()) // fun MyInterface.foo(): kotlin.Unit
如您所见,您可以通过分析字符串来确定该方法是否被覆盖。
更强的解决方案是挖掘拥有成员KFunctionImpl
和成员delegate
的{{1}}
这是很多令人讨厌的反映,甚至更令人讨厌,因为这些类中的大多数都是内部的并且是惰性初始化的。
答案 1 :(得分:1)
我们可以比较MyInterfaceImpl::class.declaredFunctions
和MyInterface::class.declaredFunctions
。
此属性列出了在此类中声明的所有函数。