java - 使用对象数组在 Scala 中调用 java.lang.reflect.Method

标签 java scala reflection

我试图通过在数组中传递方法的调用参数来通过反射调用方法。 Params 是一个列表 [Any] 并携带要传递给反射方法的值。

// make absolutely sure it's of the correct type
val args : Array [Object] = params.map (_.asInstanceOf [java.lang.Object]).toArray
System.err.println ("target method: " + method.getName + " :: " + method.getParameterTypes.toList)
System.err.println ("parameters   : " + args.getClass.getCanonicalName + "\n    " + 
    (args map (p => (p.getClass.getCanonicalName, p))).toList)
method.invoke (host, args)

我得到以下输出,一切看起来都不错。被调用方法的签名与参数列表完全匹配。

target method: echo :: List(class java.lang.String)
parameters   : java.lang.Object[]
    List((java.lang.String,looks good))

遗憾的是,调用抛出 java.lang.IllegalArgumentException:参数类型不匹配

根据 Java 文档,可变参数参数(作为 Method.invoke 的参数)可以与 Object[] 一起提供。我很难过!

最佳答案

可以使用 :_* 语法从 scala 调用 Vararg 方法,它告诉 Scala 将序列解压为单独的参数:

method.invoke(host, args: _*)

这是一个完整的例子:

class A {
  def meth(a: String, b: String) = a + b
}
val host = (new A)
val method = host.getClass.getDeclaredMethods.head
val params: List[Object] = List("a", "b")
val result = method.invoke(host, params: _*)
println(result) // ab

关于java - 使用对象数组在 Scala 中调用 java.lang.reflect.Method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10339900/

相关文章:

java - 无法加载动态生成的字节码

c# - 获取 T 数组的类型,而不指定 T - Type.GetType ("T[]")

java - Modelmapper:将列表中的元素映射到 POJO 中的字段

java - 在 Java 中使用 Scala 常量

java - 如何在 Morphia/MongoDB Java 中创建复合唯一索引?

java - 是否有人在 IntelliJ 中成功混合了 scala 和 java 文件

scala - Scala 中的 List[Try[T]] 到 Try[List[T]]

arrays - 如何指定任意嵌套长度的嵌套数组的返回类型?

Java:反射、通用类型和未检查的转换

java - 在 Eclipse 插件中使用时反射库不起作用