作者:落幕YL他 | 来源:互联网 | 2022-11-19 15:58
对于以下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
以及I22
是什么意思?
1> Holger..:
这是javap -c
为您的类生成的输出(javap
是每个标准JDK附带的工具):
Compiled from "ArtClass.java"
public class ArtClass {
public ArtClass();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."":()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
}
所有指令的含义已在TheJava®虚拟机规范的"指令集"一章中指定.指令if_icmpne将弹出2 我 nt的值,Ç ö 熔点是它们,并分支到指定的目标,如果 Ñ OT Ë QUAL.
输出javap
非常清楚,分支指令指定了哪些目标,因为它们与每条指令之前打印的数字相匹配.
如果使用生成不同输出的其他工具,则必须参考该工具的文档,如何解密输出.与javap
输出的比较表明,这些前缀I4
也类似于字节码偏移,但没有进一步的上下文,例如看到方法的其他指令,这是安静无意义的.