Есть ли способ найти имя программы, запущенной на Java? Класс основного метода будет достаточно хорошим.
$ 0 (название программы) в Java? Откройте для себя основной класс?
Ответ 1
Попробуйте следующее:
StackTraceElement[] stack = Thread.currentThread ().getStackTrace ();
StackTraceElement main = stack[stack.length - 1];
String mainClass = main.getClassName ();
Конечно, это работает только в том случае, если вы работаете из основного потока. К сожалению, я не думаю, что есть системное свойство, которое вы можете запросить, чтобы узнать об этом.
Изменить: Вытягивание комментария @John Meagher, что отличная идея:
Для расширения на @jodonnell вы также можете получить все следы стека в системе используя Thread.getAllStackTraces(). Из это вы можете искать все стеки трассировки для "основной" темы определить, что такое основной класс. Эта будет работать, даже если ваш класс не работает в основном потоке.
Ответ 2
System.getProperty("sun.java.command")
Ответ 3
Для расширения на @jodonnell вы также можете получить все следы стека в системе, используя Thread.getAllStackTraces(). Из этого вы можете найти все трассировки стека для потока main
, чтобы определить, что такое основной класс. Это будет работать, даже если ваш класс не работает в основном потоке.
Ответ 4
Это код, который я придумал, используя комбинированные ответы jodonnell и John Meagher. Он сохраняет основной класс в статической переменной, чтобы уменьшить накладные расходы на повторные вызовы:
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;
}
Ответ 5
Также из командной строки вы можете запустить инструмент jps. Похоже на
jps -l
предоставит вам то, что вы хотите.
Ответ 6
Для доступа к объектам класса, когда вы находитесь в статическом контексте
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());
}
}
Очевидно, что все три вызова возвращают
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.
Ответ 7
Попробуйте следующее:
Java-классы имеют статический экземпляр своего класса (тип java.lang.Class).
Это означает, что если у нас есть класс с именем Main. Затем мы можем получить экземпляр класса Main.class
Если вам интересно только имя,
Строка className = Main.class.getName();
Ответ 8
Или вы можете просто использовать getClass(). Вы можете сделать что-то вроде:
public class Foo
{
public static final String PROGNAME = new Foo().getClass().getName();
}
И тогда PROGNAME будет доступен где угодно внутри Foo. Если вы не в статическом контексте, вам становится проще, если вы можете использовать это:
String myProgramName = this.getClass().getName();