【问题标题】:Idiomatic way to invoke methods through reflection in Kotlin通过 Kotlin 中的反射调用方法的惯用方式
【发布时间】:2017-03-21 02:15:30
【问题描述】:

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

val arguments = arrayOfNulls<Any>(numberOfParams)

// Populate arguments

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

它不断失败,并出现“参数数量错误”的 IllegalArgumentException。

我对该问题进行了一些阅读,似乎invoke() 方法的扩展运算符拒绝解压缩Array&lt;Any&gt;,因为它不等于Object[]。我可以尝试使用来自 Java 的标准 Object[],但这让我想知道,这是唯一的方法吗?这是最好的方法吗?有什么方法可以用 Kotlin 的类型做到这一点?

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

【问题讨论】:

  • 请检查此答案是否有帮助:(link)

标签: reflection kotlin


【解决方案1】:

您需要将价差运算符* 添加到您的通话中:

fooMethod.invoke(fooClass, *arguments)

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

更多详情请见Variable number of arguments (Varargs) - Functions - Kotlin Programming Language

【讨论】:

  • 我现在感觉自己像个白痴,因为我记得这个运算符存在,但我完全忘记了它。有时一个人只需要一点推动。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-25
相关资源
最近更新 更多