Java中的$ 0(程序名)?发现主要课程?

时间:2008-09-03 15:11:02

标签: java

有没有办法找到在Java中运行的程序的名称?主要方法的类别足够好。

8 个答案:

答案 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)

同样从命令行,您可以运行jps工具。听起来像是

jps -l 

会得到你想要的东西。

答案 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();