【发布时间】:2016-07-19 02:57:41
【问题描述】:
我有一个已编译的 Java 类的内容作为二进制文件(名为 X.class)。让我们假设它内部有一些具有正确 main 方法的类,但我不知道原始类名(而且它不是 X)。
如何使用 single 命令行使用java 运行它?
【问题讨论】:
我有一个已编译的 Java 类的内容作为二进制文件(名为 X.class)。让我们假设它内部有一些具有正确 main 方法的类,但我不知道原始类名(而且它不是 X)。
如何使用 single 命令行使用java 运行它?
【问题讨论】:
您可以使用javap -c <filename> 获取类的名称。从那时起,这只是空壳游戏。这适用于 OS X:
java $(javap -c File.class | head -n 2 | tail -n1 | cut -f3 -d\ )
注意子shell中\后面的空格——这是隔离类名的必要条件。
根据@nikolay-vyahhi 反馈更新:
如果您不确定类名将出现在哪个位置(例如,当不知道该类是否公开时),您可以使用tr 和grep,如下所示:
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 \\. 输出四 (!) 行,因为类可以 implements 和 extends 其他类并且它在它们的签名中。
您可以使用 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')
【讨论】: