私たちが持っているとしましょう
package MyApp.foo
object Bar {
def apply(x: Int) = x + 1
}
フルネーム( "MyApp.foo.Bar")文字列を使用して、このオブジェクトを使用して値を増やす方法は?
この機能は、C#でタスクを効率的に解決するのに役立ちましたが、Scalaではそれが恋しいです。
私たちが持っているとしましょう
package MyApp.foo
object Bar {
def apply(x: Int) = x + 1
}
フルネーム( "MyApp.foo.Bar")文字列を使用して、このオブジェクトを使用して値を増やす方法は?
この機能は、C#でタスクを効率的に解決するのに役立ちましたが、Scalaではそれが恋しいです。
私はあなたが反省を望んでいると思います。Scala 2.9.x まで利用可能な唯一の Java リフレクションと、2.10.0 以降で利用可能な Scala リフレクションがあります。後者についてのみ説明します。前者については、Java リフレクションを参照してください。
これはかなり長いですが、他の場所で Scala リフレクションを調べるか、こちらのドキュメントを読むことができます。または、Scala リフレクションのラッパーであるSMirrorを使用して、より高いレベルを提供します。
import scala.reflect.runtime.universe._
val m = runtimeMirror(getClass.getClassLoader)
val barSymbol = m staticModule "MyApp.foo.Bar"
val barType = barSymbol.typeSignature
val applySymbol = (barType declaration TermName("apply")).asMethod
val barMirror = m reflectModule barSymbol
val barInstance = barMirror.instance
val barInstanceMirror = m reflect barMirror.instance
val applyMirror = barInstanceMirror reflectMethod applySymbol
def increase(n: Int) = applyMirror.apply(n) match {
case x: Int => Some(x)
case _ => None
}