因此,有一天,当我在Wikipedia页面上查看Java字节码时,遇到了以下示例:
考虑以下Java代码:
outer:
for (int i = 2; i < 1000; i++) {
for (int j = 2; j < i; j++) {
if (i % j == 0)
continue outer;
}
System.out.println (i);
}
假设将上述代码放在方法中,Java编译器可能会将上述Java代码转换为字节代码,如下所示:
0: iconst_2
1: istore_1
2: iload_1
3: sipush 1000
6: if_icmpge 44
9: iconst_2
10: istore_2
11: iload_2
12: iload_1
13: if_icmpge 31
16: iload_1
17: iload_2
18: irem
19: ifne 25
22: goto 38
25: iinc 2, 1
28: goto 11
31: getstatic #84; //Field java/lang/System.out:Ljava/io/PrintStream;
34: iload_1
35: invokevirtual #85; //Method java/io/PrintStream.println:(I)V
38: iinc 1, 1
41: goto 2
44: return
而且我注意到,很少有goto出现过几次,这在检查JVM规范时是有效的。
我的问题是为什么?
GOTO在Java中是一个保留的但无法使用的关键字,因此为什么在编写和编译Java代码时似乎会使用goto将其编译回去。我想知道这仅仅是在较低级别的编程中总是会做的事情,还是因为JVM被信任可以更有效地使用goto字。最终,我对为什么goto被认为是一种不好的做法感到好奇,以至于Java代码中禁止使用goto,但是似乎在编译时直接将其放回了您的代码中。
问题内容: 我正在寻找用Java字节码编写一个简短的程序(也许是Hello World)。我只想使用我的文本编辑器编写字节码并运行它。我该怎么做?有一个例子吗?谢谢! 问题答案: 您可以尝试茉莉! 您可以使用以下命令进行编译: 然后像任何类一样运行它: 更新资料 我看到您的问题提到“不使用Javac或Java”。您能说明一下该声明的意思吗?
我一直在测试char casting,我经历了以下几点: 有人能解释为什么我在1中给字节添加了一个final时它工作得很好吗?
问题内容: 我一直在测试字符转换,并经历了以下过程: 任何人都可以解释为什么当我在字节中添加final后在1中可以正常工作吗? 问题答案: 当变量为时,编译器将自动内联其值为1的值。该值可表示为,即: 相当于 实际上,根据本节中有关变量的部分,将其视为常量: 原始类型或类型的变量,即,用一个编译时间常量表达式(§15.28)初始化,被称为 恒定变量 。
问题内容: 我经常卡在没有源的Java类文件中,并且试图理解我手头的问题。 请注意,反编译器是有用的,但在所有情况下都不足够… 我有两个问题 有哪些工具可用来查看Java字节码(最好从linux命令行中获得) 什么是熟悉Java字节码语法的良好参考 问题答案: 与其直接查看Java字节码(需要熟悉Java虚拟机及其操作),不如尝试使用Java反编译实用程序。反编译器将尝试从指定文件创建源文件。 该
问题内容: 我的编译器类正在创建一种我们打算编译为Java字节码的语言。我们已经取得了很大的进步,并且正在接近代码生成的时间。 我们在查找有关如何从编译器创建.class文件的信息时遇到问题。您有什么资源可以为我们提供帮助吗?我们已经有很多关于指令集的文档,但是需要有关如何直接填写类文件/十六进制编写的信息。 我们不需要有关反编译.class文件的信息或建议。 即使是从头开始编写.class文件的
问题内容: 我有一个字节数组。我希望将该数组的每个字节String转换为其对应的十六进制值。 Java中是否有任何函数可以将字节数组转换为十六进制? 问题答案: 也可以看看 java.util.Formatter syntax %[flags][width]conversion Flag ‘0’ - The result will be zero-padded Width 2 Conversion