繁体   English   中英

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

[英]Invoke java.lang.reflect.Method in Scala with Object array

我试图通过在数组中传递方法的调用参数来通过反射来调用方法。 参数是一个列表[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文档,可以为Object []提供varargs参数(如Method.invoke的参数一样)。 我很沮丧!

可以使用:_*语法从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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM