在运行一个非常简单的HelloWorld应用程序时,我对输出中的常量池有些困惑。
测试代码
public class TestClass {
public static void main(String[] args) {
System.out.println("hello world");
}
}
Javap -c -verbose 输出(剪辑)
// Header + consts 1..22 snipped
const #22 = String #23; // hello world
const #23 = Asciz hello world;
public static void main(java.lang.String[]);
Signature: ([Ljava/lang/String;)V
Code:
Stack=2, Locals=1, Args_size=1
0: getstatic #16; //Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #22; //String hello world
5: invokevirtual #24; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
// Debug info snipped
}
好的,所以在第三行中,我们可以看到通过 #22 将 "hello world" 常量推入堆栈,但是 const #23 似乎保存了实际值。我有点困惑当 #(数字) 出现在打印输出的右侧时表示什么意思。
Oracle/Sun 的 javap 手册 并不十分详尽。
jdk-7
开始(http://bugs.sun.com/view_bug.do?bug_id=6868539),它是utf8
而不是asciz
。 - Eugene