Java字节码循环内ifeq对应continue的代码写法及JDK版本咨询
生成含ifeq跳转continue+后续goto指令的Java代码及JDK版本说明
对应Java代码结构
要编译出你描述的字节码结构(ifeq跳转实现continue,后续紧跟goto指令),核心是在循环内部构建以下逻辑:
- 一个条件判断,满足时执行
continue(触发ifeq跳回循环起始位置) - 该判断之后存在一段代码,且代码末尾有另一个触发跳转的控制语句(最常见的是
break,对应goto指令跳出循环)
可编译的代码示例
For循环版本
public class LoopDemo { public static void main(String[] args) { int validCount = 0; // 循环结构是基础 for (int num = 0; num < 15; num++) { // 此if的条件编译后会生成ifeq/ifne指令,满足则执行continue if (num % 2 == 0) { continue; } validCount++; // 此if的条件编译后会生成goto相关指令,满足则执行break if (validCount >= 6) { break; } } System.out.println("Valid numbers counted: " + validCount); } }
Do-While循环版本
public class DoWhileDemo { public static void main(String[] args) { int i = 0; int sum = 0; do { if (i <= 3) { i++; continue; // 触发ifeq跳转回循环起始 } sum += i; if (sum > 20) { break; // 触发goto跳转跳出循环 } i++; } while (i < 10); System.out.println("Sum: " + sum); } }
字节码验证
编译上述代码后,执行javap -c 类名查看字节码,会看到类似逻辑的指令片段:
...
112: iload_2
113: iconst_2
114: irem
115: ifne 122
118: goto 148 // 对应continue,跳回循环条件判断位置
122: iinc 1, 1
125: iload_1
126: bipush 6
128: if_icmpge 148 // 对应break,跳转到循环外
...
(注:具体偏移量会因代码细节变化,但控制流逻辑与你描述的ifeq跳转continue、后续goto完全一致)
兼容的JDK版本
这种字节码结构是Java标准编译器的常规输出,从JDK 1.0到最新的JDK 21(包括所有LTS版本如8、11、17)都支持。无论使用Oracle OpenJDK、Adoptium、Amazon Corretto等官方/主流发行版的javac编译器,都会生成对应的控制流指令。
内容的提问来源于stack exchange,提问作者Neo
相关产品推荐
相关产品推荐

