2013-04-12 12 views
5

ケースクラスのコンパニオンオブジェクトtへの参照とパラメータseqのシーケンスを使用して、ケースクラスの新しいインスタンスを呼び出す方法はありますか?動的にスカラのケースクラスの新しいインスタンスを作成

パラメータの番号を自分で入力するとクラスを作成できます。

scala> case class B(n:String,a:Int,b:Int) 
defined class B 

scala> val t:AnyRef = B 
t: AnyRef = B 

scala> val m = t.getClass.getMethods.filter{m => m.getName == "apply"}. 
    filterNot {_.getReturnType.getName == "java.lang.Object"}(0) 
m: java.lang.reflect.Method = public B B$.apply(java.lang.String,int,int) 

scala> m.invoke(t,"name",1:java.lang.Integer,2:java.lang.Integer) 
res99: Object = B(name,1,2) 

私は解決できなかった問題がSeq("name",1:java.lang.Integer,2:java.lang.Integer)のような引数の配列に呼び出す呼び出すことです。どのようにそれを行うための任意のヘルプは非常に感謝しています。

私はscala 2.10.0を使用します。

+3

だけ言っ**なし**に 'Any'、' AnyVal'、 'AnyRef'、'地図それを書き留めていないのに役立ちます時々

method.invoke(t,seq: _*) 

だ[文字列を、任意] Scalaには豊富で強力な静的型システムがあります。それを避けるよりむしろ悪用するあなたのプログラムを設計するようにしてください。 –

+2

私は非常に洗練されたDSL構築を行っています。時にはあなたはそれのためにバッドランドに行く必要があります;-) – leo

答えて