首页 > 解决方案 > 动态(在运行时)调用数组的迭代器运算符函数

问题描述

尝试动态(反射)调用数组类型的迭代器函数时

    @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)

标签: kotlinreflectioniteratorruntimeoperator-keyword

解决方案


(还没有?)支持使用反射,因为 Java 的 Array 类是特殊的并且没有这样的方法。它只是 Kotlin 编译器添加的一些合成糖。

但是你可以创建一个没有反射的Iteratorfor Array- 至少在 Kotlin/JVM 上:

import kotlin.jvm.internal.*

fun main() {
    val array: Array<String> = arrayOf("A", "B")
    println(iterator(array)) // kotlin.jvm.internal.ArrayIterator
}

推荐阅读