通过Kotlin中的反射来调用方法的惯用方式

Faw*_*ter 3 reflection kotlin

我有一段Kotlin代码,试图使用Java的Reflection包来反射地调用方法:

val arguments = arrayOfNulls<Any>(numberOfParams)

// Populate arguments

try {
    fooMethod.invoke(fooClass, arguments)
} catch (e: Exception) {
    // Panic
}
Run Code Online (Sandbox Code Playgroud)

IllegalArgumentException为“错误的参数数量”时,它总是失败。

我对此问题进行了一些阅读,似乎该invoke()方法的传播运算符拒绝解压缩,Array<Any>因为它不等效于Object[]。我可以尝试使用Object[]Java中的标准,但这使我感到奇怪,这是唯一的方法吗?这是最好的方法吗?我可以用Kotlin的类型做到这一点吗?

在Kotlin中实现我想要的最理想的方式是什么?

mfu*_*n26 5

您需要*在呼叫中添加点差运算符:

fooMethod.invoke(fooClass, *arguments)
Run Code Online (Sandbox Code Playgroud)

使用arguments不带前缀的情况*将导致创建长度为1的新数组,该数组包含arguments作为其单个元素,并以形式传递argsinvoke。使用spread运算符对其进行前缀会使该arguments数组invoke作为as 传递args

有关更多详细信息,请参见可变参数数目(Varargs)-函数-Kotlin编程语言