Scala: Правильный способ получить имя класса для объекта? - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть класс, который содержит метод 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. Но метод static main находится внутри класса с именем Test, тогда как Test$ содержит нестатический main. Очевидно, я могу сделать обходной путь, просто удалив $ в конце, но я ищу более удовлетворительное / надежное решение.

1 Ответ

0 голосов
/ 07 сентября 2018

Возможным решением будет использование ClassTag из scala.reflect ( см. API ). Я имею в виду что-то вроде следующего:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...