パッケージjava.lang.classfile.constantpool


パッケージ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定数をモデル化します。