如何在不知道 class 名字的情况下 运行 Java class

How to run Java class without knowing a class name

我有一个 content 编译的 Java class 作为二进制文件(名为 X.class)。假设它内部有一些 class 和适当的 main 方法,但我不知道原始的 class 名称(而且它不是 X)。

如何使用 单个 命令行 运行 它与 java 一起使用?

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

javap X.class

它将反汇编 class 并打印出 package、protected 和 public 字段和方法:

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

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

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

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

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

请注意子 shell 中 \ 之后的 space - 这需要隔离 class 名称。

根据@nikolay-vyahhi 反馈更新: 如果您不确定 class 名称将出现在哪个位置(例如,当不知道 class 是否为 public 时),您可以使用 trgrep,像这样:

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