如何在不知道 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 时),您可以使用 tr
和 grep
,像这样:
java $(javap -c File.class | head -n2| tail -n1 | tr [:space:] \n | grep -A1 "class\|interface" | tail -n1)
我有一个 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 时),您可以使用 tr
和 grep
,像这样:
java $(javap -c File.class | head -n2| tail -n1 | tr [:space:] \n | grep -A1 "class\|interface" | tail -n1)