Java 7 String switch 反编译:意外指令
我已经反编译了一个非常简单的类,它使用新的 Java 7 字符串切换功能.
I have decompiled a very simple class that uses the new Java 7 String Switch feature.
班级:
public class StringSwitch {
public static void main(String[] args) {
final String color = "red";
switch (color) {
case "red":
System.out.println("IS RED!");
break;
case "black":
System.out.println("IS BLACK");
break;
case "blue":
System.out.println("IS BLUE");
break;
case "green":
System.out.println("IS GREEN");
break;
}
}
}
针对这个类运行 Java 7 javap",会生成一组有趣的指令(完整的反汇编代码可用 这里):
Running the Java 7 "javap" against this class, generates an interesting set of instructions (the complete disassembled code is available here):
public static void main(java.lang.String[]);
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=4, args_size=1
...
12: lookupswitch { // 4
112785: 56
3027034: 84
93818879: 70
98619139: 98
default: 109
}
56: aload_2
57: ldc #2 // String red
...
110: tableswitch { // 0 to 3
0: 140
1: 151
2: 162
3: 173
default: 181
}
140: getstatic #8 // Field java/lang/System.out:Ljava/io/PrintStream;
143: ldc #9 // String IS RED!
...
181: return
LOOKUPSWITCH"是switch case稀疏时使用的指令,可以代替switch"语句的默认指令TABLESWITCH.
The "LOOKUPSWITCH" is an instruction used when the switch case is sparse and can replace the TABLESWITCH, that is the default instruction for "switch" statements.
那么,问题是,为什么我们会看到一个LOOKUPSWITCH",然后是一个TABLESWITCH"?
So, the question is, why are we seeing a "LOOKUPSWITCH" followed by a "TABLESWITCH"?
谢谢卢西亚诺
推荐答案
使用 switch 中的字符串查找正确的 case 语句是一个两步过程.
With strings in switch finding the correct case statement is a 2 step process.
- 计算开关字符串的哈希码并在 case 语句中查找哈希码匹配",这是通过 LOOKUPSWITCH 完成的.注意 LOOKUPSWITCH 下的大整数,它们是 case 语句中字符串的哈希码.
- 现在 2 个字符串可以具有相同的哈希码,但可能性不大.因此,实际的字符串比较仍然必须进行.因此,一旦哈希码匹配,则将 switch 字符串与匹配的 case 语句中的字符串进行比较.LOOKUPSWITCH 和 TABLESWITCH 之间的指令正是这样做的.确认匹配后,将通过 TABLESWITCH 访问要为匹配的 case 语句执行的代码.
还要注意,指定您使用的编译器很有用 - javac 或 ECJ(Java 的 Eclipse 编译器).两种编译器都可能生成不同的字节码.
Also note that it is useful to specify which compiler you used - javac or ECJ (Eclipse compiler for java). Both compilers may generate the bytecode differently.
相关文章