3

私たちが持っているとしましょう

package MyApp.foo

object Bar {
  def apply(x: Int) = x + 1
}

フルネーム( "MyApp.foo.Bar")文字列を使用して、このオブジェクトを使用して値を増やす方法は?

この機能は、C#でタスクを効率的に解決するのに役立ちましたが、Scalaではそれが恋しいです。

4

1 に答える 1

3

私はあなたが反省を望んでいると思います。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
}
于 2013-02-24T05:40:08.820 に答える