java字节码文件解读

一个简单的main方法

public class ConstantPool {
    public static void main(String[] args) {
        String b = "卧虎";
        String a = b + "藏龙";
        System.out.println(a.intern() == a);
    }
}

使用javac指定编译,将生成字节码文件ConstantPool.class

javac ConstantPool.java

使用javap反编译

javap -v ConstantPool.class >a.txt

得到的字节码解析

  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=3, locals=3, args_size=1
         0: ldc           #2                  // String 卧虎  常量池的常量值入栈
         2: astore_1                          //将栈顶引用类型值保存到局部变量1中
         3: new           #3                  // class java/lang/StringBuilder   创建新的对象实例。
         6: dup                               //复制栈顶一个字长的数据,将复制后的数据压栈。
         7: invokespecial #4                  // Method java/lang/StringBuilder."":()V  编译时方法绑定调用方法
        10: aload_1                           //从局部变量1中装载引用类型值入栈
        11: invokevirtual #5                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
        14: ldc           #6                  // String 藏龙   常量池的常量值入栈
        16: invokevirtual #5                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
        19: invokevirtual #7                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
        22: astore_2                          //将栈顶引用类型值保存到局部变量2中
        23: getstatic     #8                  // Field java/lang/System.out:Ljava/io/PrintStream; 获取静态字段的值
        26: aload_2                                      //从局部变量2中装载引用类型值入栈
        27: invokevirtual #9                  // Method java/lang/String.intern:()Ljava/lang/String;
        30: aload_2
        31: if_acmpne     38
        34: iconst_1                           //1(int)值入栈
        35: goto          39                   //无条件跳转到指定位置
        38: iconst_0                              //1(int)值入栈
        39: invokevirtual #10                 // Method java/io/PrintStream.println:(Z)V
        42: return                            //void函数返回。
      LineNumberTable:
        line 6: 0
        line 7: 3
        line 8: 23
        line 9: 42

你可能感兴趣的:(JVM)