【问题标题】:How to run Java class without knowing a class name如何在不知道类名的情况下运行 Java 类
【发布时间】:2016-07-19 02:57:41
【问题描述】:

我有一个已编译的 Java 类的内容作为二进制文件(名为 X.class)。让我们假设它内部有一些具有正确 main 方法的类,但我不知道原始类名(而且它不是 X)。

如何使用 single 命令行使用java 运行它?

【问题讨论】:

    标签: java main classname


    【解决方案1】:

    您可以使用javap -c <filename> 获取类的名称。从那时起,这只是空壳游戏。这适用于 OS X:

    java $(javap -c File.class | head -n 2 | tail -n1 | cut -f3 -d\ )
    

    注意子shell中\后面的空格——这是隔离类名的必要条件。

    根据@nikolay-vyahhi 反馈更新: 如果您不确定类名将出现在哪个位置(例如,当不知道该类是否公开时),您可以使用trgrep,如下所示:

    java $(javap -c File.class | head -n2| tail -n1 | tr [:space:] \\n | grep -A1 "class\|interface" | tail -n1)
    

    【讨论】:

    • 谢谢!在我的例子中,javap 之后的第二行是class Secret {,而不是public class Secret {,所以命令cut -f3 -d\ 只给出{,而不是Secret。不确定是否可以使用相同的 cut 参数支持这两种情况。
    • 谢谢!但它仍然不适用于class Secret {——类名中没有点。此外,javap -c java.lang.String | head -n2 | tail -n1 | tr [:space:] \\n | grep \\. 输出四 (!) 行,因为类可以 implementsextends 其他类并且它在它们的签名中。
    【解决方案2】:

    您可以使用 javap 来做到这一点:

    javap X.class
    

    它将反汇编类并打印出包、保护和公共字段和方法:

    Compiled from "Test.java"
    public class Test {
      public Test();
      public static void main(java.lang.String...);
    }
    

    然后你可以使用它来运行应用程序:

    java $(javap X.class | sed -n 's/.*class \(.*\) {/\1/p')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-06
      • 1970-01-01
      • 1970-01-01
      • 2013-01-27
      • 2013-05-21
      • 1970-01-01
      相关资源
      最近更新 更多