java - 如何在 Kotlin 中使用 varargs(参数数量)和反射

标签 java kotlin reflection

我有这个方法(在java中):

public void insert(final MyCustomObject... obj)

我知道 MyCustomObject 的包名称和类名称以及方法名称,因此我在反射期间使用它(使用 Kotlin):

val myCustomObjectClass = Class.forName("${packageName}${className}")
val myCustomObject = myCustomObjectClass.getConstructor(String::class.java, Long::class.java)
val insertMethod = classContainingInsertMethod.getDeclaredMethod("insert", myCustomObjectClass)

classContainingInsertMethod是之前创建的。现在,我如何调用该方法?我有一个异常(exception),没有这样的方法。我知道这一点,因为它是多个参数,而不是单个参数。

我尝试使用arrayOf(myCustomObjectClass)::class.java但这给了我另一个异常(exception)。使用 *myCustomObjectClass 也不起作用。

最佳答案

import java.lang.reflect.Array
val varArg = Array.newInstance(myCustomObjectClass, 1)
val varArgClass = varArg::class.java
val myCustomObjectConstructor = myCustomObjectClass.getConstructor(String::class.java, Long::class.java)
val myCustomObjectElement = myCustomObjectConstructor.newInstance("", 0L)
Array.set(varArg, myCustomObjectElement, 0)

(这里数组的大小和 set 调用的数量将对应于您想要在可变参数中传递的参数数量),然后

val insertMethod = classContainingInsertMethod.getDeclaredMethod("insert", varArgClass)
insertMethod.invoke(instanceOfClassContainingInsertMethod, varArg)

关于java - 如何在 Kotlin 中使用 varargs(参数数量)和反射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59856651/

相关文章:

java - 安卓工作室 : How to import java class from outside the project?

java - Groovy 可以复制类签名但修改实现吗

java - 通过依赖注入(inject)创建的动态类型对象

java - 使用反射调用类内部的构造函数

java - BufferedInputStream 如何从操作系统请求数据 block

java - 如何在用Java编写的多模块 Play 项目中运行单元测试

android - PreferenceFragments 不在同一个 FragmentManager 中?

kotlin 单例异常是好是坏?

java - 安卓工作室 : Could not set process working directory to "new directory"

java - 使用 pojo/java bean 的 getter 方法获取属性/字段名称?