Class 在Scala中,如何获取“对象”(不是类的实例)的*name*?

Class 在Scala中,如何获取“对象”(不是类的实例)的*name*?,class,scala,object,reflection,jvm-languages,Class,Scala,Object,Reflection,Jvm Languages,在Scala中,我可以这样声明一个对象: class Thing object Thingy extends Thing 如何在Scala中获取“Thingy”(对象的名称) 我听说Lift(Scala的web框架)能够做到这一点。只需获取类对象,然后获取其名称 scala> Thingy.getClass.getName res1: java.lang.String = Thingy$ 剩下的就是删除$ 编辑: 要删除封闭对象的名称和尾随$,只需执行以下操作即可 res1.spli

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

class Thing

object Thingy extends Thing
如何在Scala中获取
“Thingy”
(对象的名称)


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

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

scala> Thingy.getClass.getName
res1: java.lang.String = Thingy$
剩下的就是删除
$

编辑:

要删除封闭对象的名称和尾随
$
,只需执行以下操作即可

res1.split("\\$").last

如果将其声明为
case对象
而不仅仅是
对象
,则它将自动扩展,并且您可以调用
productPrefix
方法来获取对象的名称:

scala> case object Thingy
defined module Thingy

scala> Thingy.productPrefix
res4: java.lang.String = Thingy

我不知道哪种方法是正确的,但这可以通过Scala反射实现:

implicitly[TypeTag[Thingy.type]].tpe.termSymbol.name.toString

您还没有变量名吗?你为什么要这么做呢?也看看这个:@Shaheer对象不是变量。你很困惑。当一个变量指向一个对象时,该变量的名称与该对象的名称不同。如果对象是在其他对象或方法中定义的,那么它也可以是test.Main$Thingy$或test.Main$Test1$2$。@SergeyPassichenko:那么你必须进行更多的分析才能得到值,但是基本的想法是一样的。@SergeyPassichenko:答案中包含了一个解决方案。它不包括方法中定义的对象,但通常不需要
Thingy.getClass.getName
=>“Thingy$”但是
println(Thingy.getClass.getName)
打印
“$line2.$read$$iw$$iw$Thingy$”
。。有人能解释一下吗?在2.10中,你可以这样做:scala>object Foo定义模块Foo scala>import scala.reflect.runtime.universe.\uScala>typeOf[Foo.type].termSymbol.name res0:reflect.runtime.universe.name=FooI喜欢它的简单和标准API。然而,不幸的是,该产品并不能保证它始终只是实现它的对象AFAICT的名称。
def nameOf[T](implicit ev: ClassTag[T]):String = ev.runtimeClass.getName.replace("$", "")