Java 识别for/while循环的ASM字节码

Java 识别for/while循环的ASM字节码,java,java-bytecode-asm,Java,Java Bytecode Asm,使用ASM字节码,我们可以识别方法体中的循环还是while循环?这取决于要提取的信息。原则上,您可以通过搜索向后分支来检测循环。如果没有通常的代码结构,循环就不能工作。如果使用通常的代码结构,则无法找到不属于循环一部分的反向分支 因此,如果您想明确命名它们,所有字节码指令goto,goto\u w,if-acmpeq,if-acmpne,if-icmpeq,if-icmpge,if-icmpgt,if-icmpe>,if-icmpe,,,,,,ifge,ifgt,ifle,iflt,ifne,i

使用ASM字节码,我们可以识别方法体中的循环还是while循环?

这取决于要提取的信息。原则上,您可以通过搜索向后分支来检测循环。如果没有通常的代码结构,循环就不能工作。如果使用通常的代码结构,则无法找到不属于循环一部分的反向分支

因此,如果您想明确命名它们,所有字节码指令
goto
goto\u w
if-acmpeq
if-acmpne
if-icmpeq
if-icmpge
if-icmpgt
if-icmpe>,
if-icmpe
ifge
ifgt
ifle
iflt
ifne
ifnonnull
ifnull
如果指向后,则可能指示循环

但在大多数情况下,你很难说出你有什么样的循环。编译代码中的
for
循环和
while
循环之间没有显著差异。例如,以下代码片段完全等效:


如果结构更复杂,情况会更糟,例如,当您想要确定指向同一代码位置的两个向后分支是否属于正文中带有条件
continue
语句的单个循环,或者属于两个嵌套循环时。这可能是不可能的。

你的标记没有意义。所以你想说“如果字节xyz在那里,是不是有一个while循环”?嗨,DeviceFan,你是对的。
for(a();b();c()) {
  d();
}
a();
for(;b();) {
  d();
  c();
}
a();
for(;;) {
  if(!b()) break;
  d();
  c();
}
a();
while(b()) {
  d();
  c();
}