当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《Java中的$0(程序名)?发现主要课程?》经验,为你挑选了4个好方法。

有没有办法找到在Java中运行的程序的名称?主要方法的类就足够了.



1> jodonnell..:

试试这个:

    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> John Meagher..:

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


主线程可能会停止运行但应用程序仍然继续(其他非守护程序线程).这可能发生在许多GUI/Swing应用程序中,因为常见的习惯用法是主线程在EDT上调用以创建第一帧然后终止.

4> Andrew Taylo..:

这是我在使用jodonnell和John Meagher的综合响应时提出的代码.它将主类存储在静态变量中,以减少重复调用的开销:

private static Class mainClass;

public static Class getMainClass() {
  if (mainClass != null)
    return mainClass;

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

推荐阅读
农大军乐团_697
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有