3

假设我们有

package MyApp.foo

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

如何使用其全名(“MyApp.foo.Bar”)字符串通过此对象增加值?

这个功能帮助我在 C# 中有效地解决了一项任务,而我在 Scala 中很怀念它。

4

1 回答 1

3

我假设你想要反思。Java 反射是 Scala 2.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
}
于 2013-02-24T05:40:08.820 回答