定数プール
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2020/10/23 05:01 UTC 版)
「Javaクラスファイル」の記事における「定数プール」の解説
定数プールは、大部分のリテラル定数値がストアされる場所である。ここには全ての種類の数、文字列、識別子名、クラスおよびメソッドへの参照、そしてタイプデスクリプタといった値が含まれる。定数テーブル内の明確な定数への全てのインデックスや参照は、インデックスがテーブル内の最初の定数を1に指し示す(インデックス値0は不正)、16ビット(u2型)数で与えられる。 ファイルフォーマット開発中の歴史的な選択のため、定数テーブル内の定数の数は、テーブルの先にある定数テーブルカウントと実際には同じではない。最初に、テーブルは(0ではなく)1で始まるようインデックス付けされ、そのためにカウントは実際には最大インデックスとして解釈されるべきである。加えて、定数の2つの型(longおよびdouble)は連続したスロットを取る。しかし二つ目のそのスロットは決して直接使用されない幻のインデックスである。 定数テーブル内の各項目(定数)の型は、最初のバイトであるタグで識別される。このタグに続く数とこれらの解釈は、それ以降タグの値に左右される。正当な定数型とそのタグは以下の通りである: タグバイト追加のバイト定数の解説1 2+xバイト(変数) UTF-8 (Unicode) 文字列 : 直接続くエンコードされた文字列内の数を示す、16ビット数の接頭辞が付くキャラクタ文字列。エンコーディングは実際にはUTF-8ではなく、Unicode標準のエンコーディング形式のわずかな修正を含むことに注意すること。 3 4バイト Integer : ビッグエンディアンフォーマットによる符号付き32ビット2の補数 4 4バイト Float : 32ビット単精度IEEE 754浮動小数点数 5 8バイト Long : ビッグエンディアンフォーマットによる符号付き64ビット2の補数(定数テーブルの2つのスロットを占める) 6 8バイト Double : 64ビット倍精度IEEE 754浮動小数点数(定数テーブルの2つのスロットを占める) 7 2バイト クラス参照 : (内部フォーマットによる)完全修飾型クラス名を含むUTF-8文字列による定数テーブル内のインデックス(ビッグエンディアン) 8 2バイト 文字列参照 : UTF-8による定数プール内のインデックス(ビッグエンディアン) 9 4バイト フィールド参照 : 定数プール内にある2つのインデックス、最初はクラス参照で次は名前および型の記述(ビッグエンディアン) 10 4バイト メソッド参照 : 定数プール内にある2つのインデックス、最初はクラス参照で次は名前および型の記述(ビッグエンディアン) 11 4バイト インタフェース参照 : 定数プール内にある2つのインデックス、最初はクラス参照で次は名前および型の記述(ビッグエンディアン) 12 4バイト 名前および型の記述 : UTF-8による定数プール内のインデックス、最初は名前(識別子)を表し次は特別にエンコードされた型 整数定数型はintegerとlongの2つしかない。boolean、byte、そしてshortといった上位レベル言語で見られる他の定数型は、integer定数として表されなければならない。 完全修飾されたJavaのクラス名は、「java.lang.Object」のように慣例的にドットで区分けされる。しかしながら低レベルなクラス参照定数内においては、内部形式は「java/lang/Object」のように、代わりにスラッシュを使用する。 Unicode文字列は、「UTF-8文字列」とあだ名されているにも係らず、実際にはUnicode標準に従ってエンコードされておらずそれと似たような形式である。それら2つには違いがある(完全な議論についてはUTF-8を参照すること)。最初に、コードポイントU+0000は、標準的な1バイト00にエンコードする代わりに、2バイトのシーケンスC0 80としてエンコードされる。2つ目の違いは、(U+10000および上記としてBasic Multilingual Planeの外側にある)補足する文字が、UTF-8を用いて直接エンコードするのではなくUTF-16に似たサロゲートペア構造を用いてエンコードすることである。この場合、2つのサロゲートの各々がUTF-8において分割してエンコードされる。例えばU+1D11Eは、4バイトのUTF-8エンコーディングF0 9D 84 9Eではなく、6バイトのシーケンスED A0 B4 ED B4 9Eとしてエンコードされる。
※この「定数プール」の解説は、「Javaクラスファイル」の解説の一部です。
「定数プール」を含む「Javaクラスファイル」の記事については、「Javaクラスファイル」の概要を参照ください。
- 定数プールのページへのリンク