Динамический (во время выполнения) вызов функции оператора итератора для массива - PullRequest
1 голос
/ 02 августа 2020

При попытке динамически (отражения) вызвать функцию итератора типа массива

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

1 Ответ

0 голосов
/ 08 августа 2020

Это (пока?) Не поддерживается с использованием отражения, потому что классы Array Java особенные и не имеют такого метода. Это просто синтетический c сахар, добавленный компилятором Kotlin.

Но вы можете создать Iterator для Array без отражения - по крайней мере, на Kotlin / JVM:

import kotlin.jvm.internal.*

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