首页 文章

使用Object数组在Scala中调用java.lang.reflect.Method

提问于
浏览
1

我试图通过在数组中传递方法的调用参数来通过反射调用方法 . Params是List [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的参数) . 我很难过!

1 回答

  • 6

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

相关问题