Scala:获取对象类名称的正确方法?

时间:2018-09-06 16:12:33

标签: scala reflection

我有一个包含main方法的类,我希望启动一个运行该类的新进程。

但是当我尝试使用Scala来获取此类的名称时,它给了我错误的名称。例如:

object Test {
  def main(args: Array[String]) = { 
    println(Test.getClass.getCanonicalName)
  }
}

然后:

roei@roei-main:~/Java$ scalac Test.scala 
roei@roei-main:~/Java$ scala Test
Test$
roei@roei-main:~/Java$ javap Test*.class
Compiled from "Test.scala"
public final class Test {
  public static void main(java.lang.String[]);
}
Compiled from "Test.scala"
public final class Test$ {
  public static final Test$ MODULE$;
  public static {};
  public void main(java.lang.String[]);
}

Test.getClass.getCanonicalName给了我Test$不是 Test。但是静态main方法在名为Test的类内部,而Test$包含非静态main。显然,我可以只删除最后的$,但是我正在寻找更令人满意/更可靠的解决方案。

1 个答案:

答案 0 :(得分:2)

可能的解决方案是使用ClassTagsee API)中的scala.reflect。我的意思是这样的:

import scala.reflect.ClassTag
import scala.reflect.classTag

class Test

object Test {
  def main(args: Array[String]) = { 
    println(Test.getClass.getCanonicalName)
    println(classTag[Test].runtimeClass.getCanonicalName)
  }
}

它将打印:

Test$  
Test