我有一段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中实现我想要的最真实的方式是什么?
答案 0 :(得分:5)
您需要将展开运营商*
添加到您的通话中:
fooMethod.invoke(fooClass, *arguments)
使用arguments
而不使用*
作为前缀将导致长度为1的新数组包含arguments
作为其单个元素,并将其作为args
传递给{{ 1}}。使用扩展运算符对其进行前缀会导致invoke
数组作为arguments
传递给invoke
。
有关详细信息,请参阅Variable number of arguments (Varargs) - Functions - Kotlin Programming Language。