我是科特林新手。面临反射和泛型的问题。下面是我的代码。
abstract class Action {
fun sleep(body: Person.() -> Unit){
var p = Person("a");
p.body()
println(p.name + " is zzzzzzz...")
}
}
class Person(var name:String =""){
companion object:Action();
}
inline fun <reified T> test(){
val companionObject = T::class.companionObject
if (companionObject != null) {
println(companionObject.javaObjectType)
val functionEx = companionObject.functions.filter { it.name.equals("sleep") }.first()
// How to invoke functionEx with block and "this"
}
}
fun main(args: Array<String>) {
Person.sleep {
this.name = "abc"
}
test<Person>()
}
我想调用sleep
功能通过functionEx
使用与 main 中相同的块代码。我正在努力应对this
操作员。
我正在使用一些 API 并通过以下方式模拟了该问题Action
and Person
。所以不能改变他们的实现。它只是test
功能在我的控制之下。
这应该有效:
inline fun <reified T> test() {
val companionObject = T::class.companionObject
if (companionObject != null) {
val body: Person.() -> Unit = { println("body called on $name!") }
val companionInstance = T::class.companionObjectInstance
val functionEx = companionObject.functions.first { it.name.equals("sleep") }
functionEx.call(companionInstance, body)
}
}
使用以下方式调用该函数call(...),您需要将伴随对象实例作为第一个参数传递(它代表sleep
函数的接收者)和一个实例功能类型 Person.() -> Unit
作为第二个。
注意companionObject返回的不是伴生对象实例,而是它的实例KClass
。要获取实例,请使用companionObjectInstance反而。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)