嵌套对象名称

sky*_*ren 2 reflection scala

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

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

val b = new B
println(b.FI)
Run Code Online (Sandbox Code Playgroud)

使用Scala 2.9.1,它打印B $ FI $

使用Scala 2.9.2,它打印FI $

我真正想要的是"FI".获取FI的最佳方法是什么,并确保它在未来版本的scala中不会改变?是否有一些反思支持来帮助我?

dre*_*xin 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
Run Code Online (Sandbox Code Playgroud)