gpt4 book ai didi

java - 如何从 Kotlin 中的 KClass 获取方法

转载 作者:行者123 更新时间:2023-12-05 00:19:02 30 4
gpt4 key购买 nike

在 java 中,当我有一个 Class<> 实例时,我有返回 Method 的 getMethod,它非常易于使用。
正如我所见,Kotlin 让生活变得更加艰难,因为这种方法不存在。除了将 KClass 转换为 Class 然后像在 Java 中一样使用它之外,是否有一种获得特定方法的好方法?

最佳答案

假设你有这个类:

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

companion object {
fun foo() = println("foo")
}
}
这给你一个函数实例,你可以用 invoke() 调用。 (这是一个运算符函数,因此您可以像使用任何其他函数一样使用括号。如果您使用这样的类名获取函数,它不会绑定(bind)到实例。因此您在调用时将实例作为第一个参数传递. (如果 sayHello() 有额外的参数,它们只会在Test 的第一个参数之后。)
val sayHelloFunction = Test::sayHello
val test = Test()
helloWorldFunction(test) // same as calling test.sayHello()
您还可以获得绑定(bind)到这样的实例的函数引用。不能在其他 Test 实例上调用它。
val test = Test()
val sayHelloFunction = test::sayHello
helloWorldFunction() // same as calling test.sayHello()
上述方法不需要 Kotlin 反射库。
要通过字符串名称获取成员,没有像 Java 的 getMethod 这样的特定函数。 ,所以你必须从 KCallable 的成员列表中选择它。 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()
这没有列出伴生对象的成员,因为那是一个不同的类。为此,您必须获得同伴的类(class):
Test.Companion::class.members.single { it.name == "foo" }
我不知道是否有办法按名称获取实例绑定(bind)版本。
至于为什么没有方便 getMethod KClass 的函数,我只能猜测因为 Kotlin 类有很多不同类型的成员(属性、函数、委托(delegate)、支持字段),也许他们想限制 API 膨胀并感觉像 single 这样的内联过滤函数是足够的。

关于java - 如何从 Kotlin 中的 KClass 获取方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64921081/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com