gpt4 book ai didi

java - Java 反编译器如何区分 for 循环和 while 循环?

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

考虑这两种方法:

public static void forLoop(int start, int limit) {
for (int i = start; i < limit; i++) {

}
}

public static void whileLoop(int start, int limit) {
int i = start;
while (i < limit) {
i++;
}
}

编译时,它们会生成字节码(这是 javap 的详细输出):

  public static void forLoop(int, int);
descriptor: (II)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=3, args_size=2
0: iload_0
1: istore_2
2: iload_2
3: iload_1
4: if_icmpge 13
7: iinc 2, 1
10: goto 2
13: return
LineNumberTable:
line 6: 0
line 9: 13
LocalVariableTable:
Start Length Slot Name Signature
2 11 2 i I
0 14 0 start I
0 14 1 limit I

public static void whileLoop(int, int);
descriptor: (II)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=3, args_size=2
0: iload_0
1: istore_2
2: iload_2
3: iload_1
4: if_icmpge 13
7: iinc 2, 1
10: goto 2
13: return
LineNumberTable:
line 12: 0
line 13: 2
line 14: 7
line 16: 13
LocalVariableTable:
Start Length Slot Name Signature
0 14 0 start I
0 14 1 limit I
2 12 2 i I

如您所见,这两种方法的代码部分完全相同。但是,当我使用 JD 反编译此类时, 它正确地产生:

public static void forLoop(int start, int limit) {
for (int i = start; i < limit; i++) {}
}

public static void whileLoop(int start, int limit)
{
int i = start;
while (i < limit) {
i++;
}
}

它是如何做到这一点的?这些方法的字节码完全一样!尽管每个方法的 LineNumberTableLocalVariableTable 属性都不同,但我不愿意相信这是原因,因为这些不是 Code 的必需属性 要包含的方法的属性(根据 section 4.7 of The Java Language Specification, Java SE 8 Edition )。

最佳答案

行号和局部变量作用域。

for 循环:

 LineNumberTable:
line 6: 0
line 9: 13
LocalVariableTable:
Start Length Slot Name Signature
2 11 2 i I
0 14 0 start I
0 14 1 limit I

while 循环:

LineNumberTable:
line 12: 0
line 13: 2
line 14: 7
line 16: 13
LocalVariableTable:
Start Length Slot Name Signature
0 14 0 start I
0 14 1 limit I
2 12 2 i I

for 循环具有更少的不同代码行 - 这是有道理的,因为它将初始化和递增包含在一行中。

关于java - Java 反编译器如何区分 for 循环和 while 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39111894/

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