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()
2条答案
按热度按时间yws3nbqq1#
得到一个
Class
从KClass
,你只要打电话.java
在上面(和.kotlin
走另一条路)。mum43rcc2#
假设你有这门课:
这将为您提供一个可以调用的函数示例
invoke()
(这是一个运算符函数,因此可以像使用其他函数一样使用括号。如果使用这样的类名获取函数,则它不会绑定到示例。因此,在调用时将示例作为第一个参数传递(如果sayHello()
如果有额外的参数,它们会紧跟测试的第一个参数。)您还可以获得绑定到这样一个示例的函数引用。不能在其他测试示例上调用它。
上述方法不需要kotlin反射库。
要通过字符串名称获取成员,没有像java那样的特定函数
getMethod
,所以您必须从成员列表中选择它,这是可以调用的。kcallable没有operator fun invoke
,所以你必须使用call
调用它,或将它强制转换为特定的函数类型(在本例中是(Test) -> Unit
).这不会列出伴随对象的成员,因为它是另一个类。为此,您必须获得同伴的课程:
我不知道是否有办法通过名称获得示例绑定版本。
至于为什么没有方便
getMethod
对于kclass函数,我只能猜测,因为kotlin类有太多不同类型的成员(属性、函数、委托、支持字段),所以它们可能希望限制api膨胀,并感觉内联过滤函数single
足够了。