作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 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 反射库。
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/
我是一名优秀的程序员,十分优秀!