非常に単純な HelloWorld アプリケーションで 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 行目で、#22 を介して "hello world" 定数がスタックにプッシュされていますが、const #23 は実際の値を保持しているようです。プリントアウトの右側に表示される #(数字) が何を意味するのか、少し混乱していると思います。
Javap に関する Oracle/Sun の man ページには、まだ十分とは言えない点がたくさんあります。