Class 在Scala中,如何获取“对象”(不是类的实例)的*name*?
在Scala中,我可以这样声明一个对象: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
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("$", "")