【问题标题】:Dynamically (at Runtime) Calling The iterator Operator Function Of An Array动态(在运行时)调用数组的迭代器运算符函数
【发布时间】:2020-11-23 00:09:06
【问题描述】:

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

    @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 defined in kotlin.Array[DeserializedSimpleFunctionDescriptor@1199fe66] (member = null)

【问题讨论】:

    标签: kotlin reflection iterator runtime operator-keyword


    【解决方案1】:

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

    但是您可以为 Array 创建一个 Iterator 而无需反射 - 至少在 Kotlin/JVM 上:

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

    【讨论】:

      猜你喜欢
      • 2011-10-20
      • 1970-01-01
      • 2021-06-10
      • 1970-01-01
      • 2021-05-14
      • 1970-01-01
      • 1970-01-01
      • 2020-09-24
      • 1970-01-01
      相关资源
      最近更新 更多