KClass :: memberExtensionFunctions всегда будет пустым - PullRequest
0 голосов
/ 30 апреля 2018

Код

import kotlin.reflect.full.*

class FooBar(val bar: String)
fun FooBar.baz(): Unit {println(this.bar)}

fun main(args: Array<String>) {
    FooBar::class.declaredMemberExtensionFunctions.forEach {
        println(it)
    }
    FooBar::class.memberExtensionFunctions.forEach {
        println(it)
    }
}

Выход пуст

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

TLDR : вы не сможете этого сделать. Поскольку функции расширения могут быть объявлены повсюду, вы ограничены в том, что система отражений может сделать для вас.

На kotlinlang.org есть ветка , в которой описан этот точный вопрос и почему это невозможно.

По сути, Объявленная функция KotlinMemberExtensionFunctions может перечислять функции расширения, которые объявлены как часть класса, а не внешне. Состояние документов:

Возвращает функции расширения , объявленные в этом классе .

И, конечно же, memberExtensionFunctions ведет себя аналогично:

Возвращает функции расширения, объявленные в этом классе и во всех его суперклассах.

Вот что @Yole говорит в этой теме, почему это невозможно:

Задача поиска всех функций расширения для Foo эквивалентна поиску всех методов, для которых Foo является первым параметром. Ни один из них невозможен без доступа к каждому классу в вашем приложении через рефлексию.

@ Йоль здесь, он может дать вам более авторитетный ответ.

0 голосов
/ 30 апреля 2018

Это связано с тем, что DeclaMemberExtensionFunctions возвращает только те функции расширения, которые объявлены внутри класса (как видно из документов ), а FooBar.baz () - это объявление верхнего уровня (поэтому оно не объявлено внутри FooBar.

class FooBar(val bar: String) {
    fun FooBar.baz(): Unit {
        println(this.bar)
    }
}

Хотя я полагаю, что это не то, что вам нужно, структурирование функции расширения, подобной этой, приведет к выводу строк основного метода.

...