KClass :: memberExtensionFunctions总是为空

时间:2018-04-30 13:44:50

标签: kotlin kotlin-reflect

代码

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 :(得分:2)

这是因为declaredMemberExtensionFunctions只返回在类中声明的扩展函数(如docs中所示),而FooBar.baz()是顶级声明(因此它不在FooBar中声明。

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

虽然我想这不是你想要的,但是像这样构造扩展函数会使你的主方法输出行。

答案 1 :(得分:1)

TLDR :您无法做到这一点。因为扩展函数可以在任何地方声明,所以你在反射系统可以为你做的事情上受到限制。

有一个thread on kotlinlang.org涵盖了这个确切的问题以及为什么不可能。

基本上,Kotlin's declaredMemberExtensionFunctions function能够列出声明为类的一部分而不是外部的扩展函数。文档声明:

  

返回在此类中声明的扩展函数

当然,memberExtensionFunctions行为相似:

  

返回在此类及其所有超类中声明的扩展函数。

以下是@Yole在该主题中所说的为什么这是不可能的:

  

查找Foo的所有扩展函数的任务等同于查找将Foo作为第一个参数的所有方法。如果不通过反射访问应用程序中的每个类,这些都是不可能的。

@Yole就在这里,他或许可以为你提供更权威的答案。