在Kotlin中通过反思调用方法的习惯性方法
我有一段Kotlin代码试图反思地调用一个使用Java的Reflection包的方法:
val arguments = arrayOfNulls<Any>(numberOfParams) // Populate arguments try { fooMethod.invoke(fooClass, arguments) } catch (e: Exception) { // Panic }
它保持与“错误的参数数量IllegalArgumentException”失败。
我在这个问题上做了一些阅读,看来invoke()
方法的spread操作符拒绝拆开Array<Any>
因为它不等于Object[]
。 我可以尝试使用来自Java的标准Object[]
,但这让我怀疑,这是唯一的方法吗? 这是最好的方法吗? 有什么方法可以用Kotlin的类型来做到这一点?
什么是最实现的方式来达到我想要的Kotlin?
您需要将扩展运算符*
添加到您的呼叫中:
fooMethod.invoke(fooClass, *arguments)
使用不加前缀的arguments
*
将导致一个长度为1的新数组包含arguments
作为其单个元素被创建并作为args
传递给invoke
。 用扩展运算符前缀它将导致arguments
数组作为args
传递以invoke
。
请参阅可变数量的参数(可变参数) – 函数 – Kotlin编程语言的更多详细信息。