代码之家  ›  专栏  ›  技术社区  ›  Daniel

检测主类

  •  3
  • Daniel  · 技术社区  · 14 年前

    我可以检测我的应用程序的主要类吗?一个,要么在命令行上给出,要么从命令行上给出的JAR中加载?

    如果这不可能,为什么不呢?

    编辑:也许我不清楚。我知道我的应用程序总是有很多入口点,但是当应用程序运行时,只有一个入口点用于启动当前的JVM。这是我需要知道的。

    4 回复  |  直到 9 年前
        1
  •  7
  •   aioobe    14 年前

    首先,应用程序可以 几个入口点 . 它只是一个类,包含一个公共静态方法 主要的 参数类型为 String[] .

    所以,简短的回答, ,一组类可能有几个入口点。

    如果您想要列出一个应用程序的所有入口点,您只需要遍历这些类并寻找这样的主要方法。

    如果创建一个 “可运行的JAR文件” 但是,清单文件中有一个条目看起来像

    Main-Class: MyPackage.MyClass
    

    它指定应用程序的主要类。

        2
  •  1
  •   Kevin Brock    14 年前

    一种可能是使用线程的堆栈跟踪并查找初始化类。但是,这只能在跟踪位于初始主线程上时工作。

    Throwable t = new Throwable();
    StackTraceElement[] elems = t.getStackTrace();
    String initClass = elems[elems.length - 1].getClassName();
    String initMethod = elems[elems.length - 1].getMethodName();
    

    这也将帮助您了解这有多困难。最初的主线程甚至不必再运行了。您甚至可以尝试将此支票直接放入 main 您的某个类的静态方法仍然不能正常工作。可以通过反射从另一个类执行主方法,并且启动方法本身可能已经在启动线程以外的线程上运行。

    对于Swing应用程序,标准的习惯用法是在激活第一个表单后让启动的主线程终止。所以在这些情况下,您可以确定主类和启动线程不再运行。

        3
  •  0
  •   finnw    14 年前

    您可以获取堆栈跟踪,例如

    StackTraceElement[] stack = new Throwable().getStackTrace();
    

    在命令行应用程序中,最后一个元素将是主类:

    System.out.println(stack[stack.length - 1].getClassName());
    

    对于servlet、applet或其他插件来说,它更复杂(您必须遍历堆栈,寻找具有相同的类 ClassLoader 作为当前线程。)

        4
  •  0
  •   thebiggestlebowski    9 年前

    这很干净:从命令行中作为程序参数传入类名。从那里,您可以使用反射等来实例化它。

    java foo.bar.MyMainClass foo.bar.MyMainClass