Java中的$ 0(程序名)? 探索主类?

有没有办法find在Java中运行的程序的名称? 主要方法的类将是足够好的。

尝试这个:

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

当然,这只适用于从主线程运行的情况。 不幸的是,我不认为有一个系统属性,你可以查询找出来。

编辑:引入@John Meagher的评论,这是一个好主意:

要扩展@jodonnell,你也可以使用Thread.getAllStackTraces()获得系统中的所有堆栈跟踪。 从这里你可以search“主”线程的所有栈跟踪来确定主类是什么。 即使你的类没有在主线程中运行,这也可以工作。

 System.getProperty("sun.java.command") 

要扩展@jodonnell,你也可以使用Thread.getAllStackTraces()获得系统中的所有堆栈跟踪。 从这里你可以searchmain线程的所有堆栈跟踪来确定主类是什么。 即使你的类没有在主线程中运行,这也可以工作。

这是我在使用jodonnell和John Meagher的联合反应时提出的代码。 它将主类存储在静态variables中,以减less重复调用的开销:

 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; } 

也可以从命令行运行jps工具。 听起来像一个

 jps -l 

会得到你想要的。

在静态上下文中访问类对象

 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. 

尝试这个 :

Java类有自己的类的静态实例(java.lang.Classtypes)。

这意味着如果我们有一个名为Main的类。 然后我们可以通过Main.class获取它的类实例

如果你只对名字感兴趣,

String className = Main.class.getName();

或者你可以使用getClass()。 你可以做一些事情:

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

然后PROGNAME将在Foo的任何地方可用。 如果你不在一个静态的上下文中,你可以使用这个方法变得更简单:

 String myProgramName = this.getClass().getName();