假设我们有
package MyApp.foo
object Bar {
def apply(x: Int) = x + 1
}
如何使用该对象的全名("MyApp.foo.Bar"(字符串来增加值?
这个功能帮助我在C#中高效地解决了一个任务,而我在Scala中很怀念它。
我想你想要反射。Java反射是Scala2.9.x之前唯一可用的反射,Scala反射从2.10.0开始可用。我将只解释后者——查找前者的Java反射。
这很长,但您可以在其他地方查找Scala反射,或者在这里阅读文档。或者,使用SMirror,它是Scala反射的包装器,提供了更高的级别。
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
}