2012-06-22 3 views
2

Je veux connaître le nom d'un objet donné dans une classeNested nom de l'objet

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

val b = new B 
println(b.FI) 

Avec Scala 2.9.1 imprime B $ FI $

Avec Scala 2.9.2 il imprime FI $

Ce que je veux vraiment, c'est "FI". Quel est le meilleur moyen d'obtenir FI et être sûr qu'il ne changera pas dans les futures versions de scala? Y a-t-il un support de réflexion pour m'aider?

+0

Voyez-vous le même comportement si vous utilisez le nom complet (par exemple '' getName' au lieu de getSimpleName')? Cela pourrait être un changement de comportement de la façon dont le simple marquage de noms fonctionne, ce qui ne serait pas un problème en général puisque les noms simples ne seront jamais le moyen de référencer une classe sans ambiguïté. –

Répondre

5

Ceci est possible avec la nouvelle API de réflexion introduite dans Scala 2.10 comme suit:

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