1

メソッドの呼び出し引数を配列に渡して、リフレクションを介してメソッドを呼び出そうとしています。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ドキュメントによると、varargs引数(Method.invokeのパラメータがそうであるように)はObject[]で指定できます。困った!

4

1 に答える 1

6

Varargメソッドは:_*、シーケンスを個々の引数にアンパックするようにScalaに指示する構文を使用して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
于 2012-04-26T19:21:02.200 に答える