Kotlin调用带有反射的伴随函数

Kotlin调用带有反射的伴随函数,kotlin,Kotlin,我是科特林的新手。面对反射和泛型的问题。下面是我的代码 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

我是科特林的新手。面对反射和泛型的问题。下面是我的代码

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>()
}
抽象集体诉讼{
有趣的睡眠(身体:人。->单位){
var p=个人(“a”);
p、 正文()
println(p.name+“是zzzzz…”)
}
}
类别人员(变量名称:String=”“){
伴随对象:Action();
}
内联乐趣测试(){
val companionObject=T::class.companionObject
if(companionObject!=null){
println(companionObject.javaObjectType)
val functionEx=companionObject.functions.filter{it.name.equals(“sleep”)}.first()
//如何使用block和“this”调用functionEx
}
}
趣味主线(args:Array){
人。睡眠{
this.name=“abc”
}
测试()
}
我想通过
functionEx
调用
sleep
函数,调用的块代码与main中相同。我正在与
这个
操作符斗争

我正在使用一些API,并通过
Action
Person
模拟了这个问题。所以不能改变它们的实现。这只是我控制下的
测试功能。

这应该可以:

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)
    }
}
inlinefun测试(){
val companionObject=T::class.companionObject
if(companionObject!=null){
val body:Person.(->Unit={println(“在$name上调用的body!”)}
val companionInstance=T::class.companionObject实例
val functionEx=companionObject.functions.first{it.name.equals(“sleep”)}
functionEx.call(公司立场、机构)
}
}
要使用调用函数,需要将伴生对象实例作为第一个参数(代表
sleep
函数的接收器)传递,并将
Person.(->Unit
的实例作为第二个参数传递

请注意,返回的不是伴随对象实例,而是它的
KClass
。要获取实例,请改用