パッケージjava.lang.classfile.instruction
パッケージjava.lang.classfile.instruction
java.lang.classfile
ライブラリのコード手順を説明するインタフェースを提供します。
java.lang.classfile.instruction
パッケージには、コード命令を記述するインタフェースが含まれています。 これらのインタフェースの実装は不変です。
特に指定がないかぎり、null
またはnull
要素を含む配列またはコレクションを引数としてクラス・ファイルAPIクラスまたはインタフェースのコンストラクタまたはメソッドに渡すと、NullPointerException
がスローされます。
指示の読取り
命令と疑似命令は、通常、CodeModel::forEach
などのCodeModel
からアクセスされ、パターン・マッチングによって分類されます。
class
ファイルから読み取ると、命令は遅延して膨張します。これらの命令の内容は、ベア構造以外では、解析を高速化するために評価されません。 パターン・マッチングでフィルタされたものなど、ユーザーへの指示では、コード配列内の無関係な命令の不要な読取りを回避するために、コンテンツがオンデマンドで読み取られます。
class
ファイルの解析が遅延しているため、不正な形式のclass
ファイル・データを示すIllegalArgumentException
は、メソッドの起動時にスローできます。 たとえば、TypeCheckInstruction
の命令オブジェクトはCodeModel
から取得できますが、後続の.type()
の起動はIllegalArgumentException
で失敗する可能性があります。これは、命令が不正な定数プール索引を参照しているためです。
命令の記述
命令の記述はCodeBuilder
で行われます。 命令を記述する最も基本的な方法は、すべての有効な命令をサポートする命令オブジェクトをCodeBuilder::with
に渡すことです。 ただし、CodeBuilder
には、ニーモニックによって命名された命令を簡単に作成するための多数の「コンビニエンス・ファクトリ・メソッド」が用意されています。 これらのアクセサは、命令オブジェクトを渡すよりも簡潔で、多くの場合、実行時により効率的です。
class
ファイル形式の制限により、一部の命令はCodeBuilder
で表現できない場合があります。 BranchInstruction
の場合などの一部のシナリオでは、「クラス・ファイルAPI」オプションは、代わりにコード生成で代替を使用できるかどうかを制御します。 それ以外の場合は、CodeBuilder
コマンドと生成されたcode
配列データのパリティを確保するために、ファストに構成できます。
- Java Virtual Machine仕様を参照してください:
-
6.5 手順
- 導入されたバージョン:
- 24
-
インタフェースクラス説明
Code
属性のcode
配列内の配列ロード命令をモデル化します。Code
属性のcode
配列内の配列ストア命令をモデル化します。Code
属性のcode
配列の分岐命令(条件付きまたは無条件)をモデル化します。CharacterRangeTable
属性内の単一のエントリをモデル化する擬似命令。"intrinsic"、"argument"、"load"定数命令など、Code
属性のcode
配列の定数ロード命令をモデル化します。命令の定数値を直接エンコードする"引数定数"命令をモデル化します。定数値をopcodeにエンコードする"組み込み定数"命令をモデル化します。定数値を定数プールにエンコードする"ロード定数"命令をモデル化します。i2l
などのCode
属性のcode
配列のプリミティブ変換命令をモデル化します。命令のマーカー・インタフェースが、Code
属性のcode
配列から中断されました。Code
属性のexception_table
配列内のエントリをモデル化する擬似命令。Code
属性のcode
配列内のフィールド・アクセス命令をモデル化します。Code
属性のcode
配列のローカル変数増分命令をモデル化します。Code
属性のcode
配列で動的に計算されるコール・サイト起動命令をモデル化します。invokedynamic
以外のCode
属性のcode
配列のメソッド呼出し命令をモデル化します。指定されたラベルがCode
属性の現在の位置に対応していることを示す擬似命令。特定の行番号のコードを示す疑似命令は、Code
属性の現在の位置より後に始まります。Code
属性のcode
配列内のローカル変数ロード命令をモデル化します。LocalVariableTable
属性内の単一のエントリをモデル化する擬似命令。LocalVariableTypeTable
属性内の単一のエントリをモデル化する擬似命令。Code
属性のcode
配列のlookupswitch
命令をモデル化します。Code
属性のcode
配列のmonitorenter
またはmonitorexit
命令をモデル化します。Code
属性のcode
配列のmultianewarray
命令をモデル化します。Code
属性のcode
配列のnew
命令をモデル化します。Code
属性のcode
配列のnewarray
命令をモデル化します。Code
属性のcode
配列のanewarray
命令をモデル化します。Code
属性のcode
配列のnop
命令をモデル化します。Code
属性のcode
配列内の算術演算子命令をモデル化します。Code
属性のcode
配列内のメソッドからの戻り命令をモデル化します。Code
属性のcode
配列内のスタック操作命令をモデル化します。ローカル変数ストア命令をCode
属性のcode
配列にモデル化します。lookupswitch
またはtableswitch
命令で1つのケースをモデル化します。Code
属性のcode
配列のtableswitch
命令をモデル化します。Code
属性のcode
配列のathrow
命令をモデル化します。Code
属性のcode
配列のinstanceof
またはcheckcast
命令をモデル化します。