for循环的字节码

源代码:

public class Wizard {
    private int age;
    
    private void forCycle() {
        for (int i = 0; i < 10; i++) {
            System.out.println(i);
        }
    }
}

javap -v -p Wizard.class 得到class文件:

Classfile /D:/Users/Administrator/workspace/TestJava/bin/com/bytecode/Wizard.class
  Last modified 2018-3-17; size 545 bytes
  MD5 checksum 529c4f32d75aa1bdce39f2b8fa128d76
  Compiled from "Wizard.java"
public class com.bytecode.Wizard
  SourceFile: "Wizard.java"
  minor version: 0
  major version: 51
  flags: ACC_PUBLIC, ACC_SUPER

Constant pool:
   #1 = Class              #2             //  com/bytecode/Wizard
   #2 = Utf8               com/bytecode/Wizard
   #3 = Class              #4             //  java/lang/Object
   #4 = Utf8               java/lang/Object
   #5 = Utf8               age
   #6 = Utf8               I
   #7 = Utf8               <init>
   #8 = Utf8               ()V
   #9 = Utf8               Code
  #10 = Methodref          #3.#11         //  java/lang/Object."<init>":()V
  #11 = NameAndType        #7:#8          //  "<init>":()V
  #12 = Utf8               LineNumberTable
  #13 = Utf8               LocalVariableTable
  #14 = Utf8               this
  #15 = Utf8               Lcom/bytecode/Wizard;
  #16 = Utf8               forCycle
  #17 = Fieldref           #18.#20        //  java/lang/System.out:Ljava/io/PrintStream;
  #18 = Class              #19            //  java/lang/System
  #19 = Utf8               java/lang/System
  #20 = NameAndType        #21:#22        //  out:Ljava/io/PrintStream;
  #21 = Utf8               out
  #22 = Utf8               Ljava/io/PrintStream;
  #23 = Methodref          #24.#26        //  java/io/PrintStream.println:(I)V
  #24 = Class              #25            //  java/io/PrintStream
  #25 = Utf8               java/io/PrintStream
  #26 = NameAndType        #27:#28        //  println:(I)V
  #27 = Utf8               println
  #28 = Utf8               (I)V
  #29 = Utf8               i
  #30 = Utf8               StackMapTable
  #31 = Utf8               SourceFile
  #32 = Utf8               Wizard.java
{
  private int age;
    flags: ACC_PRIVATE


  public com.bytecode.Wizard();
    flags: ACC_PUBLIC

    Code:
      stack=1, locals=1, args_size=1
         0: aload_0       
         1: invokespecial #10                 // Method java/lang/Object."<init>":()V
         4: return        
      LineNumberTable:
        line 3: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
               0       5     0  this   Lcom/bytecode/Wizard;

  private void forCycle();
    flags: ACC_PRIVATE

    Code:
      stack=2, locals=2, args_size=1
         0: iconst_0      
         1: istore_1      
         2: goto          15
         5: getstatic     #17                 // Field java/lang/System.out:Ljava/io/PrintStream;
         8: iload_1       
         9: invokevirtual #23                 // Method java/io/PrintStream.println:(I)V
        12: iinc          1, 1
        15: iload_1       
        16: bipush        10
        18: if_icmplt     5
        21: return        
      LineNumberTable:
        line 7: 0
        line 8: 5
        line 7: 12
        line 10: 21
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
               0      22     0  this   Lcom/bytecode/Wizard;
               2      19     1     i   I
      StackMapTable: number_of_entries = 2
           frame_type = 252 /* append */
             offset_delta = 5
        locals = [ int ]
           frame_type = 9 /* same */

}

分析for循环的字节码:

字节码 描述 操作数栈
iconst_0 0入栈 0
istore_1 把0赋值给局部变量i  
goto 15 跳转到第15行  
iload_1 局部变量i的值入栈 0
bipush 10 10入栈 0, 10
if_icmplt 5 比较0和10,小于则跳到第5行  
getstatic #17 System.out入栈 Systme.out
iload_1 局部变量i的值入栈 System.out, 0
invokevirtual #23 调用print方法  
iinc 1, 1 局部变量i自增1  
iload_1 把i的值入栈 2
原文地址:https://www.cnblogs.com/allenwas3/p/8588583.html