2

我想知道类中给定对象的名称

class B {
   abstract class F{
       def name = getClass.getSimpleName
   }
   object FI extends F
}

val b = new B
println(b.FI)

使用 Scala 2.9.1 它打印 B$FI$

使用 Scala 2.9.2 它打印 FI$

我真正想要的是“FI”。获得 FI 并确保它在未来版本的 scala 中不会改变的最佳方法是什么?是否有一些反射支持可以帮助我?

4

1 回答 1

5

这可以通过 Scala 2.10 中引入的新反射 API 实现,如下所示:

scala> import scala.reflect.runtime.universe._
import scala.reflect.runtime.universe._

scala> val mirror = runtimeMirror(getClass.getClassLoader)
mirror: reflect.runtime.universe.Mirror = JavaMirror with scala.tools.nsc.interpreter.IMain$TranslatingClassLoader@609a5d54 of type class scala.tools.nsc.interpreter.IMain$TranslatingClassLoader with classpath <unknown>

scala> mirror.reflect(new B().FI).symbol.name
res24: reflect.runtime.universe.Name = FI
于 2012-06-22T16:02:24.910 回答