2011-11-20 10 views
5

定数プールに関するjavapコマンドから生成された出力に関する質問はほとんどありません。 javapを印刷した場合、それは私が理解しAsciz文字列として文字列定数を定義し、プールがnull終了アスキーの意味:Javap Asciz Strings

const #20 = Asciz  hello world; 

これは、文字列の長さが不明であることを暗示する、とあなたは、各バイトを読んでいまし解析しますnullに遭遇するまで

ただし、定数プール文字列定数の長さは、文字列に先行する2バイトで定義され、nullが付加されていません。 (Constant pool specification)。

javapは、文字列をAscizと誤って定義していますか?Ascizには私が気付いていない別の意味がありますか?

答えて

4

bug #6868539を見ます。 OpenJDK7で修正されましたが、javapは代わりにUtf8と表示されます。

+0

パーフェクト、素敵な発見。 – Jivings

0

const#20は実際の文字列ではなく、文字列に使用されるUTF8定義文字です。あなたはおそらく定数#20を参照する文字列である別の定数を持っています。 asciz定数は、フィールド名などの文字列以外のものに使用されます。実際の情報には、UTF8タグ、長さ、およびバイトが含まれます。

http://java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html

+2

これは私の短い定義で説明したものです。あなたは実際に私が行ったのと同じ参照にリンクしています。 ASCIZ文字列ではなく、UTF8文字列を定義するという事実は、私が言及したものです。 – Jivings

+0

クラスファイルフォーマットの仕様でヌル終端のASCII文字列のリファレンスがなかったので、私はあなたが文字列がプール内でどのように定義されているのかを考えたと思いました。 (1.0仕様であっても、ASCII文字列はなく、むしろUnicodeであり、いずれもヌルで終了しません)。あなたが私よりもあなたの質問をよく理解していたようです。 –

+0

私が知りたいのは、彼らが明確にヌル終了していないときに定数プールでAscizという名前が付けられている理由です。 – Jivings