有没有办法找到在Java中运行的程序的名称?主要方法的类别足够好。
答案 0 :(得分:45)
试试这个:
StackTraceElement[] stack = Thread.currentThread ().getStackTrace ();
StackTraceElement main = stack[stack.length - 1];
String mainClass = main.getClassName ();
当然,这只适用于从主线程运行的情况。不幸的是,我不认为有一个系统属性可以查询以找到它。
编辑:拉入@John Meagher的评论,这是一个好主意:
要扩展@jodonnell,您也可以 获取系统中的所有堆栈跟踪 使用Thread.getAllStackTraces()。从 这可以搜索所有堆栈 “主”线程的跟踪 确定主类是什么。这个 即使你的班级没有,也会奏效 在主线程中运行。
答案 1 :(得分:18)
System.getProperty("sun.java.command")
答案 2 :(得分:15)
要扩展@jodonnell,您还可以使用Thread.getAllStackTraces()获取系统中的所有堆栈跟踪。从这里你可以搜索main
线程的所有堆栈跟踪来确定主类是什么。即使您的类没有在主线程中运行,这也可以工作。
答案 3 :(得分:8)
这是我在使用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;
}
答案 4 :(得分:3)
答案 5 :(得分:2)
用于在静态上下文中访问类对象
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.
答案 6 :(得分:-3)
试试这个:
Java类具有自己的类的静态实例(java.lang.Class类型)。
这意味着如果我们有一个名为Main的类。 然后我们可以得到它的类实例 Main.class
如果您只对名字感兴趣,
String className = Main.class.getName();
答案 7 :(得分:-5)
或者你可以使用getClass()。你可以这样做:
public class Foo
{
public static final String PROGNAME = new Foo().getClass().getName();
}
然后PROGNAME将在Foo内的任何地方可用。如果您不在静态环境中,则可以使用它变得更容易:
String myProgramName = this.getClass().getName();