In Scala, how do I get the *name* of an `object` (not an instance of a class)?

前端 未结 4 1833
后悔当初
后悔当初 2020-12-25 14:07

In Scala, I can declare an object like so:

class Thing

object Thingy extends Thing

How would I get \"Thingy\" (the name of th

相关标签:
4条回答
  • 2020-12-25 14:37
    def nameOf[T](implicit ev: ClassTag[T]):String = ev.runtimeClass.getName.replace("$", "")
    
    0 讨论(0)
  • 2020-12-25 14:48

    I don't know which way is the proper way, but this could be achieved by Scala reflection:

    implicitly[TypeTag[Thingy.type]].tpe.termSymbol.name.toString
    
    0 讨论(0)
  • 2020-12-25 14:52

    If you declare it as a case object rather than just an object then it'll automatically extend the Product trait and you can call the productPrefix method to get the object's name:

    scala> case object Thingy
    defined module Thingy
    
    scala> Thingy.productPrefix
    res4: java.lang.String = Thingy
    
    0 讨论(0)
  • 2020-12-25 14:59

    Just get the class object and then its name.

    scala> Thingy.getClass.getName
    res1: java.lang.String = Thingy$
    

    All that's left is to remove the $.

    EDIT:

    To remove names of enclosing objects and the tailing $ it is sufficient to do

    res1.split("\\$").last
    
    0 讨论(0)
提交回复
热议问题