2

我正在学习 Kotlin 如何评估脚本,我在BasicJvmScriptEvaluator中看到了如下代码:

    val ctor = java.constructors.single()

    val saveClassLoader = Thread.currentThread().contextClassLoader
    Thread.currentThread().contextClassLoader = this.java.classLoader
    return try {
        ctor.newInstance(*args.toArray())
    } finally {
        Thread.currentThread().contextClassLoader = saveClassLoader
    }

我不明白代码java.constructors.single(),没有名为 java.constructors 的包。我应该如何理解这段代码?

4

1 回答 1

5

重要的是要意识到你在一个扩展函数中操作KClass. 所以java实际上是一个调用,this.java它返回java.lang.ClassKClass. 然后从 s 中获取一个 sconstructors数组,并获取该数组中的一个(并且只有一个,否则抛出异常)元素。ConstructorClasssingle()

如果您将代码扩展为多行,则可能更容易看到发生了什么:

val clazz: java.lang.Class = this.java // 'this' is an instance of kotlin.reflect.KClass
val ctors: kotlin.Array<Constructor> = clazz.constructors
val ctor: java.lang.reflect.Constructor = ctors.single()

single()函数是在(和其他类型)上定义的扩展函数Array

于 2020-10-21T10:36:02.757 回答