在非常简单的HelloWorld应用程序上运行javap时,我对常量池周围的输出存在一些疑惑。了解常量池的javap输出
测试代码
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
}
好了,第3行,我们看到了推动的 “Hello World” 的恒通过#22进入堆栈,但const#23似乎保存了实际值。我想我对#(数字)出现在打印输出右侧时的含义有些困惑。
Oracle/Sun's man page for javap还有很多不足之处。
截至'jdk-7'(http://bugs.sun.com/view_bug.do?bug_id=6868539)它是'utf8'而不是'asciz' – Eugene 2017-11-21 17:06:56