gpt4 book ai didi

Java 7 字符串开关反编译 : unexpected instruction

转载 作者:搜寻专家 更新时间:2023-10-30 19:42:24 25 4
gpt4 key购买 nike

我反编译了一个非常简单的类,它使用了新的 Java 7 String Switch 特性。

类(class):

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”,生成一组有趣的指令(完整的反汇编代码可用 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 稀疏时使用的指令,可以替代 TABLESWITCH,这是“switch”语句的默认指令。

那么,问题是,为什么我们看到“LOOKUPSWITCH”后跟“TABLESWITCH”?

谢谢卢西亚诺

最佳答案

通过 switch 中的字符串找到正确的 case 语句是一个两步过程。

  1. 计算开关字符串的哈希码并在 case 语句中查找“哈希码匹配”,这是通过 LOOKUPSWITCH 完成的。请注意 LOOKUPSWITCH 下的大整数,这些是 case 语句中字符串的哈希码。
  2. 现在 2 个字符串可以具有相同的哈希码,但可能性很小。因此,实际的字符串比较仍必须进行。因此,一旦 hashcode 匹配,switch 字符串就会与匹配的 case 语句中的字符串进行比较。 LOOKUPSWITCH 和 TABLESWITCH 之间的指令正是这样做的。确认匹配后,将通过 TABLESWITCH 到达要为匹配的 case 语句执行的代码。

另请注意,指定您使用的编译器很有用 - javac 或 ECJ (Java 的 Eclipse 编译器)。两种编译器生成的字节码可能不同。

关于Java 7 字符串开关反编译 : unexpected instruction,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6956792/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com