kotlin - 动态(在运行时)调用数组的迭代器运算符函数
问题描述
尝试动态(反射)调用数组类型的迭代器函数时
@Test
fun test_x() {
val array: Array<String> = arrayOf("A", "B")
val f: KFunction<*> = array::class.memberFunctions.filter { it.name == "iterator" && it.isOperator }.first()
KotlinReflectionUtils.functionJsonInfo(f).printJson()
val result = f.call(array)
println(result)
}
KotlinReflectionUtils.functionJsonInfo(f).printJson()
是带有以下输出的调试行
{
"name" : "iterator",
"returnType" : "kotlin.collections.Iterator<T>",
"parameters" : [ {
"index" : 0,
"name" : null,
"type" : {
"toString()" : "kotlin.Array<T>",
"classifier" : "class kotlin.Array"
},
"java_class" : "kotlin.reflect.jvm.internal.KParameterImpl",
"optional?" : false,
"vararg?" : false,
"isValue?" : false
} ],
"instance_receiver_parameter" : {
"index" : 0,
"name" : null,
"type" : {
"toString()" : "kotlin.Array<T>",
"classifier" : "class kotlin.Array"
},
"java_class" : "kotlin.reflect.jvm.internal.KParameterImpl",
"optional?" : false,
"vararg?" : false
},
"visibility" : "public",
"external?" : false,
"infix?" : false,
"inline?" : false,
"operator?" : true,
"isFinal?" : true,
"suspend?" : false
}
val result = f.call(array)
引发以下异常
kotlin.reflect.jvm.internal.KotlinReflectionInternalError:无法计算函数的调用者:public final operator fun iterator():kotlin.collections.Iterator 在 kotlin.Array[DeserializedSimpleFunctionDescriptor@1199fe66] 中定义(成员 = null)
解决方案
(还没有?)支持使用反射,因为 Java 的 Array 类是特殊的并且没有这样的方法。它只是 Kotlin 编译器添加的一些合成糖。
但是你可以创建一个没有反射的Iterator
for Array
- 至少在 Kotlin/JVM 上:
import kotlin.jvm.internal.*
fun main() {
val array: Array<String> = arrayOf("A", "B")
println(iterator(array)) // kotlin.jvm.internal.ArrayIterator
}
推荐阅读
- go - 如何在 go 中使用枚举?
- unit-testing - 使用相同的参数链接多个调用以返回不同的结果
- r - 为什么经过一些迭代(在 R 中)后,readLines(来自 url)结果会发生变化?
- javascript - 商店更新时组件不会重新渲染 - Mobx
- c - Libcurl 问题 - “初始化元素不是常量”
- f# - F# interactive 不与输入交互
- javascript - Firebase auth Jest 测试
- android - Android 数据绑定:示例与现实
- php - 如何使用 MAMP 将我的 phpmyadmin 链接到我的 php?
- powershell - 通过 powershell true CSV 导入用户