对于以下Java类:
public class ArtClass {
public boolean foo(int x) {
if(x == 3956681)
return true;
else if(x == 9855021)
return true;
else if(x == 63085561)
return true;
else
return false;
}
}
其JVM指令为:
I4 Branch 1 IF_ICMPNE L3
I13 Branch 2 IF_ICMPNE L5
I22 Branch 3 IF_ICMPNE L7
我知道第一分支在第三行,第二和第三分支相同,但是IF_ICMPNE
是什么意思,I4
,I13
和{ {1}}是什么意思?
答案 0 :(得分:5)
这是为您的课程生成的输出javap -c
(javap
是每个标准JDK附带的工具):
Compiled from "ArtClass.java"
public class ArtClass {
public ArtClass();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public boolean foo(int);
Code:
0: iload_1
1: ldc #2 // int 3956681
3: if_icmpne 8
6: iconst_1
7: ireturn
8: iload_1
9: ldc #3 // int 9855021
11: if_icmpne 16
14: iconst_1
15: ireturn
16: iload_1
17: ldc #4 // int 63085561
19: if_icmpne 24
22: iconst_1
23: ireturn
24: iconst_0
25: ireturn
}
所有指令的含义已在“Instruction Set” chapter of the The Java® Virtual Machine Specification中指定。指令if_icmpne将弹出两个 i nt值,它们是 c o mp ,然后跳转到指定的目标 n 是否 e 合格。
javap
的输出非常清楚,分支指令已指定了哪些目标,因为它们与每条指令之前打印的数字相匹配。
如果您使用其他工具产生不同的输出,则必须参考该工具的文档,以了解如何解密输出。与javap
的输出进行比较表明,像I4
这样的前缀也引用了字节码偏移量,但没有进一步的上下文,例如看到该方法的其他说明,那是毫无意义的。
答案 1 :(得分:1)
此处是文档:http://homepages.inf.ed.ac.uk/kwxm/JVM/if_icmpne.html
if_icmpne :
Description: jump to label if the two integer refs are not equal