一个简单的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."<init>":()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