2

如果不知道主类的名称,这可能吗?特别是我想要在应用程序启动时通过信息电子邮件发送的实施版本属性。我知道访问它的唯一方法需要知道我想要访问其信息的包或 jar 文件的名称;我不知道如何简单地通过寻找主要课程来做到这一点。

4

2 回答 2

1

@Lee Meador 的评论指出了寻找 Manifest 的好方法。您不需要知道 jar 名称,您只需要能够识别您的清单。建议:使用其他 IMPLEMENTATION_* 属性的任意组合来识别正确的清单。如果您已经设置了 IMPLEMENTATION_VERSION,为什么不也设置 IMPLEMENTATION_NAME 以便您可以找到它。一旦你得到它,你可以浏览条目以找到你想要的。Manifest API使它变得更加容易:

            Attributes mainAtts = mf.getMainAttributes();
        if(mainAtts.containsKey(Attributes.Name.MAIN_CLASS)){
            String mainClass = mainAtts.getValue(Attributes.Name.MAIN_CLASS);
            System.out.println(mainClass);
            String mainVer = mainAtts.getValue(Attributes.Name.IMPLEMENTATION_VERSION);
            System.out.println(mainVer);
        }
于 2012-12-28T18:16:03.050 回答
0

所以你想知道主类但不想知道它的名字是什么?

为了找到您要查找的内容,您需要:

  1. 确定主类(对不起,这将是一个要求)
  2. 找出该类的加载位置
  3. 如果是 JAR 文件,则从该 JAR 文件加载清单

第 1 步可能很困难:启动主类的线程可能已经结束——例如,许多 GUI 程序将执行一个Class.main(String[])方法,然后在 AWT 线程保持进程处于活动状态时终止。您可能根本无法识别主类。如果是这样的话,你很可能不走运。您可以尝试sun.java.command系统属性,但这可能仅在 Sun/Oracle JVM 上有效。

第 2 步相当简单:获取Class's ClassLoader,然后询问 .class 文件本身的 URL。

第 3 步也相当简单:打开 JAR 文件并查找该META-INF/MANIFEST.MF文件。

于 2012-12-28T17:21:24.610 回答