Oli*_*Wah 3 reflection kotlin kotlin-reflect
我尝试使用默认参数值调用函数,而不在 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"))
}
Run Code Online (Sandbox Code Playgroud)
我有一个例外:
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)
Run Code Online (Sandbox Code Playgroud)
奇怪的是,该参数不是必需的,而是可选的......
通过一些测试, aKClass不会跟踪创建它的实际对象,主要区别在于它将this::class使用this.
您可以通过查询所有参数的信息来验证这一点:
name | isOptional | index | kind | type
-----------------------------------------------------
null false 0 INSTANCE Test
value true 1 VALUE kotlin.Double
Run Code Online (Sandbox Code Playgroud)
第一个参数实际上是类的实例。使用this::callMeWithoutParams将跟踪this,删除表的第一行,但自然不允许按名称查找成员。您仍然可以通过提供对象来调用该方法:
fun callIt(name: String) {
val member = this::class.members.first { it.name == name }
member.callBy(mapOf(member.instanceParameter!! to this))
}
Run Code Online (Sandbox Code Playgroud)