在Scala中,如何获取`object`的*name*(不是类的实例)?

Sco*_*bie 19 reflection scala class object jvm-languages

在Scala中,我可以像这样声明一个对象:

class Thing

object Thingy extends Thing
Run Code Online (Sandbox Code Playgroud)

我如何"Thingy"在Scala中获取(对象的名称)?

我听说Lift(Scala的Web框架)能够做到这一点.

Dao*_*Wen 22

如果你将它声明为a case object而不仅仅是a object然后它会自动扩展Product特征,你可以调用该productPrefix方法来获取对象的名称:

scala> case object Thingy
defined module Thingy

scala> Thingy.productPrefix
res4: java.lang.String = Thingy
Run Code Online (Sandbox Code Playgroud)


Kim*_*bel 21

只需获取类对象,然后获取其名称.

scala> Thingy.getClass.getName
res1: java.lang.String = Thingy$
Run Code Online (Sandbox Code Playgroud)

剩下的就是删除$.

编辑:

要删除封闭对象的名称和拖尾$,就足够了

res1.split("\\$").last
Run Code Online (Sandbox Code Playgroud)

  • 在2.10中,你可以这样做:scala> object Foo defined module foo scala> import scala.reflect.runtime.universe._ import scala.reflect.runtime.universe._ scala> typeOf [Foo.type] .termSymbol. name res0:reflect.runtime.universe.Name = Foo (6认同)
  • 它也可以是test.Main $ Thingy $或test.Main $ Test1 $ 2 $如果在其他对象或方法中定义了对象. (5认同)