2

我尝试使用默认参数值调用函数,而不在 Kotlin 中放置参数。

例如:

class Test {
    fun callMeWithoutParams(value : Double = 0.5) = value * 0.5

    fun callIt(name: String) = this.javaClass.kotlin
            .members.first { it.name == name }
            .callBy(emptyMap())
}

fun main(args: Array<String>) {
   println(Test().callIt("callMeWithoutParams"))
}

我有一个例外:

Exception in thread "main" java.lang.IllegalArgumentException: No argument provided for a required parameter: instance of fun 
 Test.callMeWithoutParams(kotlin.Double): kotlin.Double
     at kotlin.reflect.jvm.internal.KCallableImpl.callDefaultMethod(KCallableImpl.kt:139)
    at kotlin.reflect.jvm.internal.KCallableImpl.callBy(KCallableImpl.kt:111)
    at Test.callIt(Main.kt:15)
    at MainKt.main(Main.kt:20)

奇怪,因为参数不是必需的,而是可选的......

4

1 回答 1

4

通过一些测试,aKClass不会跟踪它创建的实际对象,主要区别在于this::class它将使用运行时类型this.

您可以通过查询有关所有参数的信息来验证这一点:

 name | isOptional | index |     kind |          type
-----------------------------------------------------
 null        false       0   INSTANCE            Test
value         true       1      VALUE   kotlin.Double

第一个参数实际上是类的实例。Usingthis::callMeWithoutParams将跟踪this,删除表的第一行,但自然不允许按名称查找成员。您仍然可以通过提供对象来调用该方法:

fun callIt(name: String) { 
    val member = this::class.members.first { it.name == name }
    member.callBy(mapOf(member.instanceParameter!! to this))
}
于 2018-01-09T20:52:51.453 回答