@pqgg7nwkd4

Как узнать какой класс запущен из командной строки java?

Добрый день.

Есть класс:
public abstract class Robot {
  public static int main(String[] args) {
    //...
  }
}

И два его наследника:
public class Send extends Robot {
//... нет своего метода main
}

public class Recv extends Robot {
//... нет своего метода main
}


Запускаем:
java -cp . Send
java -cp . Recv

При этом запускается Robot.main();

Вопрос: Как в Robot.main() узнать какой класс я запускал: Send или Recv?
Спасибо.
  • Вопрос задан
  • 409 просмотров
Решения вопроса 1
jaxtr
@jaxtr
JavaEE/Spring-разработчик
Статические методы не наследуются, так что через рефлексию это не получить.
Два варианта, пришедшие мне в голову:
В классах Recv и Send описать свои методы main, которые просто вызывают Robot.main, тогда в Robot.main можно получить информацию о вызываемом классе из стектрейса:
StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
stackTrace[stackTrace.length - 1].getClassName();


Второй вариант - посмотреть системную переменную sun.java.command, которая указывает на класс, который был запущен.
System.getProperty("sun.java.command");

Вопрос только в практическом применении этого.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Vestail
@Vestail
Software Engineer
Через рефлексию скорее всего никак этого не добиться. Можно сделать что то типа такого
public abstract class Robot {
  protected static Class loaded;
  
  public static int main(String[] args) {
     System.out.println(loaded);
  }
}

public class Send extends Robot {
	static {
		loaded = loaded == null ? Send.class : loaded; 	
	}
}
Ответ написан
Комментировать
zagayevskiy
@zagayevskiy Куратор тега Java
Android developer at Yandex
Сделайте по-человечески.
Первое - как можно быстрее уйти от статики. Делаете у робота protected final void run(String[] arts){...тут код из main...}
Второе - у каждого из наследников делаете метод main - очень простой. Внутри него одна строчка - например, new Send().run();
Теперь в run можно по getClass определить, кто вы.
Но! Это довольно плохо - когда предок знает о потомках. Вам надо придумать, как оставить всё общее в Robot, а все различия вынести в его потомков, используя полиморфизм.
Наследование статических классов(имеющих только статические методы) - это бессмысленно чуть более, чем полностью.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы