我可以检测我的应用程序的主要类吗?一个,是在命令行上给出还是从命令行给出的jar加载?
如果不可能,为什么不呢?
编辑:也许我不清楚。我知道我的应用程序总会有很多入口点,但是当应用程序运行时,只有一个入口点用于启动当前的JVM。这是我需要知道的。答案 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