KClass::memberExtensionFunctions 始终为空
KClass::memberExtensionFunctions always be empty
代码
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)
}
}
输出为空
这是因为 declaredMemberExtensionFunctions 只有 returns 在 class 中声明的扩展函数(如 docs 中所示)并且 FooBar.baz() 是顶级声明(所以没有在FooBar里面声明。
class FooBar(val bar: String) {
fun FooBar.baz(): Unit {
println(this.bar)
}
}
虽然我想这不是您想要的,但像这样构造扩展函数会使您的主方法输出行。
TLDR:你将无法做到这一点。因为可以在任何地方声明扩展函数,所以反射系统可以为你做的事情是有限的。
有一个 thread on kotlinlang.org 涵盖了这个确切的问题以及为什么不可能。
本质上,Kotlin's declaredMemberExtensionFunctions function 能够列出声明为 class 一部分的扩展函数,而不是外部。文档状态:
Returns extension functions declared in this class.
当然,memberExtensionFunctions 的行为也类似:
Returns extension functions declared in this class and all of its superclasses.
这是 @Yole 在该线程中所说的为什么这是不可能的:
The task of finding all extension functions for Foo is equivalent to finding all methods which have Foo as the first parameter. Neither of these is possible without accessing every single class in your application through reflection.
@Yole 来了,说不定能给你更权威的回答
代码
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)
}
}
输出为空
这是因为 declaredMemberExtensionFunctions 只有 returns 在 class 中声明的扩展函数(如 docs 中所示)并且 FooBar.baz() 是顶级声明(所以没有在FooBar里面声明。
class FooBar(val bar: String) {
fun FooBar.baz(): Unit {
println(this.bar)
}
}
虽然我想这不是您想要的,但像这样构造扩展函数会使您的主方法输出行。
TLDR:你将无法做到这一点。因为可以在任何地方声明扩展函数,所以反射系统可以为你做的事情是有限的。
有一个 thread on kotlinlang.org 涵盖了这个确切的问题以及为什么不可能。
本质上,Kotlin's declaredMemberExtensionFunctions function 能够列出声明为 class 一部分的扩展函数,而不是外部。文档状态:
Returns extension functions declared in this class.
当然,memberExtensionFunctions 的行为也类似:
Returns extension functions declared in this class and all of its superclasses.
这是 @Yole 在该线程中所说的为什么这是不可能的:
The task of finding all extension functions for Foo is equivalent to finding all methods which have Foo as the first parameter. Neither of these is possible without accessing every single class in your application through reflection.
@Yole 来了,说不定能给你更权威的回答