如何从kotlin中的kclass获取方法

dz6r00yl  于 2021-07-06  发布在  Java
关注(0)|答案(2)|浏览(342)

在java中,当我有一个类<>示例时,我有一个返回方法的getmethod,它非常容易使用。正如我所见,Kotlin让生活变得更艰难,因为这样的方法并不存在。除了将kclass转换为class,然后像在java中一样使用它之外,还有什么好方法可以获得特定的方法吗?

yws3nbqq

yws3nbqq1#

得到一个 ClassKClass ,你只要打电话 .java 在上面(和 .kotlin 走另一条路)。

mum43rcc

mum43rcc2#

假设你有这门课:

class Test {
    fun sayHello() = println("Hello world")

    companion object {
        fun foo() = println("foo")
    }
}

这将为您提供一个可以调用的函数示例 invoke() (这是一个运算符函数,因此可以像使用其他函数一样使用括号。如果使用这样的类名获取函数,则它不会绑定到示例。因此,在调用时将示例作为第一个参数传递(如果 sayHello() 如果有额外的参数,它们会紧跟测试的第一个参数。)

val sayHelloFunction = Test::sayHello
val test = Test()
helloWorldFunction(test) // same as calling test.sayHello()

您还可以获得绑定到这样一个示例的函数引用。不能在其他测试示例上调用它。

val test = Test()
val sayHelloFunction = test::sayHello
helloWorldFunction() // same as calling test.sayHello()

上述方法不需要kotlin反射库。
要通过字符串名称获取成员,没有像java那样的特定函数 getMethod ,所以您必须从成员列表中选择它,这是可以调用的。kcallable没有 operator fun invoke ,所以你必须使用 call 调用它,或将它强制转换为特定的函数类型(在本例中是 (Test) -> Unit ).

val sayHelloCallable = Test::class.members.single { it.name == "sayHello" }
val test = Test()
sayHelloCallable.call(test) // same as calling test.sayHello()

这不会列出伴随对象的成员,因为它是另一个类。为此,您必须获得同伴的课程:

Test.Companion::class.members.single { it.name == "foo" }

我不知道是否有办法通过名称获得示例绑定版本。
至于为什么没有方便 getMethod 对于kclass函数,我只能猜测,因为kotlin类有太多不同类型的成员(属性、函数、委托、支持字段),所以它们可能希望限制api膨胀,并感觉内联过滤函数 single 足够了。

相关问题