代码
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)
}
}
输出为空
答案 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就在这里,他或许可以为你提供更权威的答案。