パッケージjava.lang.constant
invokedynamic
コール・サイトなどのクラス・ファイル・エンティティ用に「名目記述子」を表すクラスおよびインタフェース。 これらのクラスは、バイトコードの読取りおよび書込みAPI、invokedynamic
ブートストラップ、バイトコードの固有api、およびコンパイル時またはリンク時プログラム分析ツールに使用するのに適しています。
バイトコードの読み取りおよび書き込みを行うすべてのAPIにおいて、これらの命令およびほかのクラス・ファイル構造へのオペランドをモデル化する必要があります(ブートストラップ・メソッド表またはスタック・マップのエントリなど。クラス・ファイル定数プールのエントリを頻繁に参照します。) このようなエントリは、文字列や整数などの基本タイプの値、プログラムの一部(クラスやメソッド・ハンドルなど)、または任意のユーザー定義タイプの値を示します。 ConstantDesc
階層は、バイトコード命令のオペランドをモデル化するのに便利な名目書式の定数プール・エントリを表します。
名目記述子
ConstantDesc
は、定数値の説明です。 このような説明は、定数値の「名目書式」であり、値自体ではなく、値を記述するために"recipe"が定数プール・エントリに値を格納するか、クラスのロード・コンテキストに指定された値を再構成することです。 すべてのConstantDesc
がresolve自体の参照方法 -- 説明している値をコンピュート -- ConstantDesc.resolveConstantDesc
を使用します。 名目説明で参照されるクラスおよびメソッドが存在してアクセス可能である場合、このAPIは、ConstantDesc
オブジェクトを受け入れてこれらを反映的に評価できます。
ConstantDesc
のサブタイプは、さまざまな種類の定数値を記述しています。 JVMS 4.4で定義されているロード可能な定数プール・エントリのタイプごとに、対応するサブタイプConstantDesc
があります: ClassDesc
、MethodTypeDesc
、DirectMethodHandleDesc
、String
、Integer
、Long
、Float
、Double
およびDynamicConstantDesc
。 これらのクラスは、その種類の定数の名目上の情報を抽出するための、タイプ固有のアクセッサ・メソッドを提供します。 バイトコード作成APIでConstantDesc
を検出した場合、このAPIを調査して、これらのタイプを確認し、キャストし、名目情報を抽出し、定数プールに対応するエントリを生成する必要があります。 バイトコードによる読取りAPIが定数プールのエントリを検知すると、名目記述子の適切な型に変換できます。 動的定数用のバイトコード読取りAPIでは、ファクトリDynamicConstantDesc.ofCanonical
を使用することが必要な場合があります。このファクトリDynamicConstantDesc.ofCanonical
は、ブートストラップを検査し、正しく知られているブートストラップのために、Enum.EnumDesc
などの特定のサブタイプDynamicConstantDesc
を返します。
値の名目説明を取得する別の方法は、値自体を要求することです。 Constable
は、値が独自にConstantDesc
として名目の形式で記述できるタイプです。 ユーザー定義クラスと同様に、String
やClass
実装Constable
などの基本的なタイプです。 クラス・ファイルを生成するエンティティ(コンパイラなど)は、constableなオブジェクトをイントロスペクトして、クラス・ファイルで値を表現するより効率的な方法を得ることができます。
このパッケージには、DynamicCallSiteDesc
も含まれます。これは、(non-loadable) Constant_InvokeDynamic_info
定数プールのエントリを表します。 これは、invokedynamic
命令に関連付けられたブートストラップ・メソッド、呼出し名、型およびブートストラップ引数について説明します。 また、バイトコードの読取りおよび書込みAPIでのinvokedynamic
コール・サイトの記述にも適しています。
- Java Virtual Machine仕様を参照してください:
-
4.4 定数プール
- 導入されたバージョン:
- 12
-
クラス説明constableのタイプを表します。JVMS 4.4で定義されている、ロード可能な定数値用の「名目記述子」。プリミティブ・クラス・タイプおよびその他の共通プラットフォーム・タイプの記述子を含む共通定数の「名目記述子」の事前定義値、および標準ブートストラップ・メソッドのメソッド・ハンドルの記述子。直接
MethodHandle
の場合は「名目記述子」。DirectMethodHandleDescで記述できるメソッド・ハンドルの種類。invokedynamic
呼び出しサイトの場合「名目記述子」。動的定数の場合は「名目記述子」 (Constant_Dynamic_info
で固定プールに記述されているもの。)MethodHandle
定数の場合は「名目記述子」。MethodType定数の場合は「名目記述子」。