パッケージjava.lang.classfile.constantpool
java.lang.classfile
ライブラリの定数プール・エントリを記述するインタフェースを提供します。
java.lang.classfile.constantpool
パッケージには、class
ファイル形式の定数プール・エントリを記述するインタフェースが含まれています。 定数プール・エントリは、class
ファイルの正確な構造を忠実に表す低レベル・モデルです。
特に指定がないかぎり、null
またはnull
要素を含む配列またはコレクションを引数としてクラス・ファイルAPIクラスまたはインタフェースのコンストラクタまたはメソッドに渡すと、NullPointerException
がスローされます。
定数プール・エントリの読み取り
class
ファイルから読み取ると、プール・エントリは遅延して膨張します。これらのエントリの内容は、ベア構造以外では、解析を高速化するために評価されません。 ユーザーの関心のあるエントリ(通常は他のモデルや要素からアクセス)は、そのコンテンツをオンデマンドで読み取ります。 たとえば、メソッドを検索するには、最初にアクセス・フラグでフィルタし、次にメソッド名でフィルタし、Utf8Entry.stringValue()
に対して等価をチェックするかわりにUtf8Entry.equalsString(String)
を使用する必要があります。 これにより、UTF-8エントリのインフレができるかぎり回避されます:
boolean isStaticWorkMethod(MethodModel method) {
// check static flag first to avoid unnecessary evaluation of UTF-8 entry
return (method.flags().flagsMask() & ClassFile.ACC_STATIC) != 0
// use equalsString to avoid full conversion to String for comparison
// the Utf8Entry can also act as a basic CharSequence without full conversion
&& method.methodName
().equalsString
("work");
}
このエントリは、java.lang.constant
パッケージからの名目記述子抽象化を使用して、検証されたシンボリック情報へのアクセスも定義します。 これらのシンボリック情報アクセッサは、読取りclass
ファイルに対して検証を実行し、アクセスされた定数プール・エントリに無効なデータが含まれている場合はIllegalArgumentException
をスローします。 名目記述子は検証済データを表すため、ユーザーは将来の処理で追加の検証から解放されます。
class
ファイルの解析が遅延しているため、不正な形式のclass
ファイル・データを示すIllegalArgumentException
は、メソッドの起動時にスローできます。 たとえば、ClassEntry
が最初に定数プール(無効な索引または誤ったタイプのエントリを参照しています)から読み取られた場合、参照されるUTF-8エントリが(不正な形式のUTF-8データ)に展開された場合、またはそのシンボリック情報が(文字列がクラス・エントリに対して無効です)にアクセスされた場合に、例外が発生する可能性があります。
定数プール・エントリの書き込み
一般に、ユーザーは、 class
ファイルの書込み時に定数プールとそのエントリの操作について心配する必要はありません。 ほとんどのClass-File APIモデルおよび要素には、2セットのファクトリ・メソッドがあります: 使用を表すシンボリック情報、および定数プール・エントリを受け入れるシンボリック情報を受け入れるもの。 class
ファイル・ビルダー(ClassFileBuilder.constantPool()
)に関連付けられている定数プール・ビルダーは、シンボリック情報からプール・エントリを自動的に作成または再利用します。 シンボリック情報の検証済データは、RAW定数プール・エントリ・データの無関係な解析を回避することで、class
ファイルの生成に役立ちます。
いつものように、ユーザーは、一定のプール・エントリが手元にある場合、またはclass
ファイルの生成をきめ細かく制御する必要がある場合に、定数プール・エントリを受け入れるファクトリを使用できます。
クラス構築で他のClassModel
から多くのモデルおよび要素を再利用する場合、クラス構築プロセスでは、ConstantPoolBuilder::of(ClassModel)
を介して使用可能な指定のClassModel
から拡張される定数プール・ビルダーを使用できるため、定数プール参照を持つバイト・データをバッチでコピーでき、クラスの構築が高速化されます。 これは特にクラス変換に適用でき、この動作を制御するためにConstantPoolSharingOption
が存在します。
- Java Virtual Machine仕様を参照してください:
-
4.4 定数プール
- 導入されたバージョン:
- 24
-
クラス説明注釈の要素に関連付けられた定数値を表すことができる定数プール・エントリのマーカー・インタフェース。
class
ファイルの定数プールで参照型を表すCONSTANT_Class_info
構造をモデル化します。class
ファイルの定数プールで「動的に計算される定数」を表すCONSTANT_Dynamic_info
構造をモデル化します。class
ファイルの定数プールおよびブートストラップ・メソッド表への読取りアクセスを提供します。class
ファイルの定数プールのビルダー。リクエストされたエントリを定数プールまたはブートストラップ方式表から取得できないことを示すためにスローされます。ConstantValue
属性の定数値を表すことができる定数プール・エントリのマーカー・インタフェース。class
ファイルの定数プールでdouble
定数を表すCONSTANT_Double_info
構造をモデル化します。動的に計算される定数プール・エントリ(class
ファイルの定数プールにConstantDynamicEntry
およびInvokeDynamicEntry
を含む)をモデル化するスーパー・インタフェース。class
ファイルの定数プールで、CONSTANT_Fieldref_info
構造またはフィールドへのシンボリック参照をモデル化します。class
ファイルの定数プールで、CONSTANT_Float_info
構造(float
定数)をモデル化します。class
ファイルの定数プールでCONSTANT_Integer_info
構造(int
定数)をモデル化します。class
ファイルの定数プールで、CONSTANT_InterfaceMethodRef_info
構造体またはインタフェース・メソッドへのシンボリック参照をモデル化します。class
ファイルの定数プールで、CONSTANT_InvokeDynamic_info
構造または「動的に計算されるコール・サイト」へのシンボリック参照をモデル化します。ldc
命令によるロードに適した定数プール・エントリのマーカー・インタフェース。class
ファイルの定数プールで、CONSTANT_Long_info
構造(long
定数)をモデル化します。class
ファイルの定数プール内のクラスまたはインタフェースのメンバーへのシンボリック参照をモデル化するスーパー・インタフェース(fields、「クラス・メソッド」および「インタフェース・メソッド」への参照を含む)。class
ファイルの定数プールで、CONSTANT_MethodHandle_info
構造または「メソッド・ハンドル」へのシンボリック参照をモデル化します。class
ファイルの定数プールで、CONSTANT_MethodRef_info
構造体またはクラス・メソッドへのシンボリック参照をモデル化します。class
ファイルの定数プールで、CONSTANT_MethodType_info
構造またはメソッド型へのシンボリック参照をモデル化します。class
ファイルの定数プールで、モジュールを示すCONSTANT_Module_info
構造をモデル化します。class
ファイルの定数プールで、フィールドまたはメソッドを表すCONSTANT_NameAndType_info
構造をモデル化します。class
ファイルの定数プールで、パッケージを表すCONSTANT_Package_info
をモデル化します。class
ファイルの定数プール内のエントリをモデル化します。class
ファイルの定数プールでCONSTANT_String_info
構造(文字列定数)をモデル化します。class
ファイルの定数プールで、文字列を表すCONSTANT_UTF8_info
定数をモデル化します。