如何在线程java应用程序中确定运行时的主类?

Eri*_* R. 18 java program-entry-point runtime stack-trace classloader

我想在运行时确定我的应用程序启动的类名,带有main()方法的类名,但我在另一个线程中,我的堆栈跟踪不会一直回到原始类.

我搜索了系统属性以及ClassLoader提供的所有内容,并且没有提供任何内容.这些信息不可用吗?

谢谢.

Dav*_*ave 8

JAVA_MAIN_CLASS 环境值并不总是存在,具体取决于平台。如果您只想获取启动 Java 进程的“主”类的名称,您可以这样做:

  public static String getMainClassName()
  {
    StackTraceElement trace[] = Thread.currentThread().getStackTrace();
    if (trace.length > 0) {
      return trace[trace.length - 1].getClassName();
    }
    return "Unknown";
  } 
Run Code Online (Sandbox Code Playgroud)

  • 警告:此答案仅在从主线程调用时才有效。 (6认同)

Bru*_*ard 6

请参阅Tom Hawtin给出的评论链接.这些天的解决方案是(仅限Oracle JVM):

public static String getMainClassAndArgs() {
    return System.getProperty("sun.java.command"); // like "org.x.y.Main arg1 arg2"
}
Run Code Online (Sandbox Code Playgroud)

仅使用Oracle Java 7进行测试.有关特殊情况的更多信息:http://bugs.java.com/view_bug.do?video_id = 4827318


Eri*_* R. 4

我想到了。谁能告诉我这个环境变量是否始终存在于跨操作系统的其他 java 实现中?这在 Oracle JVM 上会生成一个类似“org.xyClassName”的字符串

public static String getMainClassName() {
  for (final Map.Entry<String, String> entry : System.getenv().entrySet())
    if (entry.getKey().startsWith("JAVA_MAIN_CLASS")) // like JAVA_MAIN_CLASS_13328
      return entry.getValue();
  throw new IllegalStateException("Cannot determine main class.");
}
Run Code Online (Sandbox Code Playgroud)

  • 我的钥匙末端钉有一个数字(pid?)。例如“JAVA_MAIN_CLASS_13833”因此是startsWith()。 (3认同)