2

代码

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)
    }
}

输出为空

4

2 回答 2

2

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

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

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

于 2018-04-30T13:56:25.733 回答
1

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

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

本质上,Kotlin 的 declareMemberExtensionFunctions 函数能够列出声明为类的一部分的扩展函数,而不是外部声明。文档状态:

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

当然,memberExtensionFunctions的行为也类似:

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

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

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

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

于 2018-04-30T14:09:04.230 回答