2012-04-26 10 views
1

メソッドの呼び出し引数を配列に渡してリフレクションでメソッドを呼び出そうとしています。 ParamsはList [Any]であり、反映されたメソッドに渡す値を保持します。オブジェクト配列を持つScalaのjava.lang.reflect.Methodを呼び出す

// 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へのparamsであるように)オブジェクトを供給することができます[ ]。私は困惑している!

答えて

5

可変引数メソッドは、個々の引数にシーケンスを展開するスカラ座を伝え:_*構文、とScalaのから呼び出すことができます。

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 
+0

卓越した:

method.invoke(host, args: _*) 

ここでは完全な例です。 params:_ *は、私が探していた非常識な構文です。本当にありがとう! –

関連する問題