$ 0 (имя программы) на Java? Откройте для себя основной класс? - PullRequest
53 голосов
/ 03 сентября 2008

Есть ли способ узнать название программы, работающей на Java? Класс основного метода был бы достаточно хорош.

Ответы [ 8 ]

45 голосов
/ 03 сентября 2008

Попробуйте это:

    StackTraceElement[] stack = Thread.currentThread ().getStackTrace ();
    StackTraceElement main = stack[stack.length - 1];
    String mainClass = main.getClassName ();

Конечно, это работает, только если вы работаете из основного потока. К сожалению, я не думаю, что есть системное свойство, которое вы можете запросить, чтобы выяснить это.

Редактировать: Добавить комментарий @Джона Мигера, и это отличная идея:

Чтобы расширить @jodonnell, вы также можете получить все следы стека в системе используя Thread.getAllStackTraces (). От это вы можете искать все стека следы для "главной" темы определить, что является основным классом. это будет работать, даже если ваш класс не работает в основном потоке.

18 голосов
/ 20 октября 2012
System.getProperty("sun.java.command")
15 голосов
/ 04 сентября 2008

Чтобы расширить @jodonnell, вы также можете получить все трассировки стека в системе, используя Thread.getAllStackTraces () . Из этого вы можете найти все трассировки стека для потока main, чтобы определить, что является основным классом. Это будет работать, даже если ваш класс не работает в основном потоке.

8 голосов
/ 20 августа 2012

Это код, который я придумал, используя комбинированные ответы Джодоннелла и Джона Мигера. Он хранит основной класс в статической переменной, чтобы уменьшить накладные расходы при повторных вызовах:

private static Class<?> mainClass;

public static Class<?> getMainClass() {
  if (mainClass != null)
    return mainClass;

  Collection<StackTraceElement[]> stacks = Thread.getAllStackTraces().values();
  for (StackTraceElement[] currStack : stacks) {
    if (currStack.length==0)
      continue;
    StackTraceElement lastElem = currStack[currStack.length - 1];
    if (lastElem.getMethodName().equals("main")) {
      try {
        String mainClassName = lastElem.getClassName();
        mainClass = Class.forName(mainClassName);
        return mainClass;
      } catch (ClassNotFoundException e) {
        // bad class name in line containing main?! 
        // shouldn't happen
        e.printStackTrace();
      }
    }
  }
  return null;
}
3 голосов
/ 03 сентября 2008

Также из командной строки вы можете запустить инструмент jps . Звучит как

jps -l 

даст вам то, что вы хотите.

2 голосов
/ 16 января 2012

Для доступа к объектам класса, когда вы находитесь в статическом контексте

public final class ClassUtils {
    public static final Class[] getClassContext() {
        return new SecurityManager() { 
            protected Class[] getClassContext(){return super.getClassContext();}
        }.getClassContext(); 
    };
    private ClassUtils() {};
    public static final Class getMyClass() { return getClassContext()[2];}
    public static final Class getCallingClass() { return getClassContext()[3];}
    public static final Class getMainClass() { 
        Class[] c = getClassContext();
        return c[c.length-1];
    }
    public static final void main(final String[] arg) {
        System.out.println(getMyClass());
        System.out.println(getCallingClass());
        System.out.println(getMainClass());
    }
}

Очевидно, что здесь все 3 звонка вернутся

class ClassUtils

но вы получите изображение;

classcontext[0] is the securitymanager
classcontext[1] is the anonymous securitymanager
classcontext[2] is the class with this funky getclasscontext method
classcontext[3] is the calling class
classcontext[last entry] is the root class of this thread.
0 голосов
/ 26 августа 2011

Попробуйте это:

Классы Java имеют статический экземпляр своего собственного класса (тип java.lang.Class).

Это означает, что если у нас есть класс с именем Main. Тогда мы можем получить его экземпляр класса Main.class

Если вас интересует только имя,

String className = Main.class.getName ();

0 голосов
/ 11 марта 2010

Или вы можете просто использовать getClass (). Вы можете сделать что-то вроде:

public class Foo
{
    public static final String PROGNAME = new Foo().getClass().getName();
}

И тогда PROGNAME будет доступно в любом месте внутри Foo. Если вы не находитесь в статическом контексте, это станет проще, так как вы можете использовать это:

String myProgramName = this.getClass().getName();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...