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

时间:2017-03-20 18:00:36

标签: reflection kotlin

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

val arguments = arrayOfNulls<Any>(numberOfParams)

// Populate arguments

try {
    fooMethod.invoke(fooClass, arguments)
} catch (e: Exception) {
    // Panic
}

它一直失败,因为IllegalArgumentException&#34;参数数量错误&#34;。

我对这个问题进行了一些阅读,似乎invoke()方法的传播运算符拒绝解包Array<Any>,因为它不等同于Object[]。我可以尝试使用Java中的标准Object[],但这让我想知道,这是唯一的方法吗?这是最好的方式吗?有什么方法可以用Kotlin的类型做到这一点吗?

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

1 个答案:

答案 0 :(得分:5)

您需要将展开运营商*添加到您的通话中:

fooMethod.invoke(fooClass, *arguments)

使用arguments而不使用*作为前缀将导致长度为1的新数组包含arguments作为其单个元素,并将其作为args传递给{{ 1}}。使用扩展运算符对其进行前缀会导致invoke数组作为arguments传递给invoke

有关详细信息,请参阅Variable number of arguments (Varargs) - Functions - Kotlin Programming Language