2012-06-22 177 views
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中不會改變?有一些反思支持來幫助我嗎?

+0

你看到相同的行爲,如果你使用完全限定域名(即'getName',而不是'getSimpleName')?這可能是簡單名稱標記化如何工作的行爲的改變,這通常不是問題,因爲簡單的名稱永遠不會明確地引用類。 –

回答

5

這是可能的,在斯卡拉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 [email protected]4 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