如何在Scala中通过其全名获取对象的引用?

时间:2013-02-24 04:17:02

标签: scala reflection

假设我们有

package MyApp.foo

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

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

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

1 个答案:

答案 0 :(得分:3)

我假设你想要反思。有Java反射,这是Scala 2.9.x和Scala反射中唯一可用的,自2.10.0开始可用。我将仅解释后者 - 查找前者的Java反射。

这个很长,但你可以在其他地方查找Scala反射,或者阅读the docs here。或者,使用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
}