如何知道接口中是否已定义方法

时间:2018-12-03 20:25:55

标签: reflection kotlin

给出以下代码:

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中找不到解决方案。

2 个答案:

答案 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.declaredFunctionsMyInterface::class.declaredFunctions

此属性列出了在此类中声明的所有函数。