检测主类

时间:2010-05-20 08:10:58

标签: java

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

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

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

4 个答案:

答案 0 :(得分:7)

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

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

如果要列出应用程序的所有入口点,您只需要迭代这些类并查找这样的主要方法。

如果你创建一个“runnable jar-file”,那么Manifest文件中会有一个类似于

的条目
Main-Class: MyPackage.MyClass

指定应用程序的主类。

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:0)

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

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

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

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

servlet,applet或其他插件更复杂(你必须遍历堆栈,寻找与当前线程具有相同ClassLoader的类。)

答案 3 :(得分:0)

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

java foo.bar.MyMainClass foo.bar.MyMainClass
相关问题