Как узнать, определен ли метод в интерфейсе - PullRequest
0 голосов
/ 03 декабря 2018

Учитывая следующий код:

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 голосов
/ 05 декабря 2018

Мы можем сравнить MyInterfaceImpl::class.declaredFunctions и MyInterface::class.declaredFunctions.

В этом свойстве перечислены все функции, объявленные в этом классе.

0 голосов
/ 04 декабря 2018

Из того, что я знаю, где есть два способа достижения этой сомнительной цели.

Я продемонстрирую легкую и обсуду идею, стоящую за более сложной.

Легкая основывается напросто вызывая 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 член, который имеет dispatchReceiverParameter

Это очень неприятное отражение, которое еще более неприятно, потому что большинство этих классов являются внутренними и лениво инициализируются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...