パッケージ org.springframework.asm
クラス ClassReader
java.lang.ObjectSE
org.springframework.asm.ClassReader
Java 仮想マシン仕様(JVMS)で定義されているように、
ClassVisitor に ClassFile 構造を訪問させるパーサー。このクラスは、ClassFile コンテンツを解析し、発生したフィールド、メソッド、バイトコード命令ごとに、指定された ClassVisitor の適切な訪問メソッドを呼び出します。- 作成者:
- Eric Bruneton, Eugene Kuleshov
- 関連事項:
フィールドのサマリー
フィールド修飾子と型フィールド説明final byte[]使用すべきではありません。static final intスタックマップフレームを展開するフラグ。final intClassFile の access_flags フィールドのバイト単位のオフセット。static final intコード属性をスキップするためのフラグ。static final intSourceFile、SourceDebugExtension、LocalVariableTable、LocalVariableTypeTable、LineNumberTable、MethodParameters 属性をスキップするためのフラグ。static final intStackMap および StackMapTable 属性をスキップするためのフラグ。コンストラクターの概要
コンストラクターコンストラクター説明ClassReader(byte[] classFile) 新しいClassReaderオブジェクトを構築します。ClassReader(byte[] classFileBuffer, int classFileOffset, int classFileLength) 新しいClassReaderオブジェクトを構築します。ClassReader(InputStreamSE inputStream) 新しいClassReaderオブジェクトを構築します。ClassReader(StringSE className) 新しいClassReaderオブジェクトを構築します。メソッドのサマリー
修飾子と型メソッド説明voidaccept(ClassVisitor classVisitor, int parsingOptions) このClassReaderのコンストラクターに渡された JVMS ClassFile 構造体を、指定された訪問者に訪問させます。voidaccept(ClassVisitor classVisitor, Attribute[] attributePrototypes, int parsingOptions) このClassReaderのコンストラクターに渡された JVMS ClassFile 構造体を、指定された訪問者に訪問させます。intクラスのアクセスフラグを返します(Opcodesを参照)。クラスの内部名を返します(Type.getInternalName()を参照)。StringSE[]実装されたインターフェースの内部名を返します(Type.getInternalName()を参照)。intgetItem(int constantPoolEntryIndex) このClassReaderの JVMS 'cp_info' 構造の開始オフセットを返します(つまりintクラスの定数プールテーブルのエントリ数を返します。intクラスの定数プールテーブルに含まれる文字列の最大長の控えめな見積もりを返します。スーパークラスの内部名を返します (Type.getInternalName()を参照)。intreadByte(int offset) このClassReaderのバイト値を読み取ります。protected voidreadBytecodeInstructionOffset(int bytecodeOffset) accept(ClassVisitor,int)で次にアクセスする命令のバイトコードオフセットを処理します。readClass(int offset, char[] charBuffer) このClassReaderの CONSTANT_Class 定数プールエントリを読み取ります。readConst(int constantPoolEntryIndex, char[] charBuffer) このClassReaderの数値または文字列定数プールエントリを読み取ります。intreadInt(int offset) このClassReaderの signed int 値を読み取ります。protected Label指定されたバイトコードオフセットに対応するラベルを返します。longreadLong(int offset) このClassReaderの符号付き long 値を読み取ります。readModule(int offset, char[] charBuffer) このClassReaderの CONSTANT_Module 定数プールエントリを読み取ります。readPackage(int offset, char[] charBuffer) このClassReaderの CONSTANT_Package 定数プールエントリを読み取ります。shortreadShort(int offset) このClassReaderの符号付き short 値を読み取ります。intreadUnsignedShort(int offset) このClassReaderの符号なし short 値を読み取ります。readUTF8(int offset, char[] charBuffer) このClassReaderの CONSTANT_Utf8 定数プールエントリを読み取ります。
フィールドの詳細
SKIP_CODE
public static final int SKIP_CODEコード属性をスキップするためのフラグ。このフラグが設定されている場合、コード属性は解析も訪問もされません。- 関連事項:
SKIP_DEBUG
public static final int SKIP_DEBUGSourceFile、SourceDebugExtension、LocalVariableTable、LocalVariableTypeTable、LineNumberTable、MethodParameters 属性をスキップするためのフラグ。このフラグが設定されている場合、これらの属性は解析も訪問もされません(つまり、ClassVisitor.visitSource(java.lang.String, java.lang.String)、MethodVisitor.visitLocalVariable(java.lang.String, java.lang.String, java.lang.String, org.springframework.asm.Label, org.springframework.asm.Label, int)、MethodVisitor.visitLineNumber(int, org.springframework.asm.Label)、MethodVisitor.visitParameter(java.lang.String, int)は呼び出されません)。- 関連事項:
SKIP_FRAMES
public static final int SKIP_FRAMESStackMap および StackMapTable 属性をスキップするためのフラグ。このフラグが設定されている場合、これらの属性は解析も訪問もされません(つまり、MethodVisitor.visitFrame(int, int, java.lang.Object[], int, java.lang.Object[])は呼び出されません)。このフラグは、ClassWriter.COMPUTE_FRAMESオプションが使用されている場合に役立ちます。無視されて最初から再計算されるフレームにアクセスするのを回避します。- 関連事項:
EXPAND_FRAMES
public static final int EXPAND_FRAMESスタックマップフレームを展開するフラグ。デフォルトでは、スタックマップフレームは元の形式でアクセスされます(つまり、バージョンが V1_6 未満のクラスの場合は「展開」され、他のクラスの場合は「圧縮」されます)。このフラグが設定されている場合、スタックマップフレームは常に拡張形式でアクセスされます(このオプションは、ClassReader および ClassWriter に解凍 / 圧縮ステップを追加し、パフォーマンスを大幅に低下させます)。- 関連事項:
b
使用すべきではありません。代わりにreadByte(int)および他の読み取り方法を使用してください。このフィールドは最終的に削除されます。解析される JVMS ClassFile 構造を含むバイト配列。header
public final int headerClassFile の access_flags フィールドのバイト単位のオフセット。
コンストラクターの詳細
ClassReader
public ClassReader(byte[] classFile) 新しいClassReaderオブジェクトを構築します。- パラメーター:
classFile- 読み取る JVMS ClassFile 構造。
ClassReader
public ClassReader(byte[] classFileBuffer, int classFileOffset, int classFileLength) 新しいClassReaderオブジェクトを構築します。- パラメーター:
classFileBuffer- 読み取る JVMS ClassFile 構造を含むバイト配列。classFileOffset- 読み取られる ClassFile の最初のバイトの byteBuffer 内のオフセット。classFileLength- 読み取る ClassFile の長さ(バイト)。
ClassReader
新しいClassReaderオブジェクトを構築します。- パラメーター:
inputStream- 読み取る JVMS ClassFile 構造の入力ストリームこの入力ストリームには、ClassFile 構造自体のみを含める必要があります。現在の位置から最後まで読み取られます。- 例外:
IOExceptionSE- 読み込み中に問題が発生した場合。
ClassReader
新しいClassReaderオブジェクトを構築します。- パラメーター:
className- 読み取るクラスの完全修飾名。ClassFile 構造は、現在のクラスローダーのClassLoader.getSystemResourceAsStream(java.lang.String)SE で取得されます。- 例外:
IOExceptionSE- 読み取り中に例外が発生した場合。
メソッドの詳細
getAccess
public int getAccess()クラスのアクセスフラグを返します(Opcodesを参照)。バイトコードが 1.5 の前にあり、これらのフラグが属性で表されている場合、この値は非推奨フラグと合成フラグを反映しない場合があります。- 戻り値:
- クラスアクセスフラグ。
- 関連事項:
getClassName
クラスの内部名を返します(Type.getInternalName()を参照)。- 戻り値:
- 内部クラス名。
- 関連事項:
getSuperName
スーパークラスの内部名を返します (Type.getInternalName()を参照)。インターフェースの場合、スーパークラスはObjectSE です。- 戻り値:
- スーパークラスの内部名。
ObjectSE クラスの場合は null。 - 関連事項:
getInterfaces
実装されたインターフェースの内部名を返します(Type.getInternalName()を参照)。- 戻り値:
- 直接実装されたインターフェースの内部名。継承された実装インターフェースは返されません。
- 関連事項:
accept
このClassReaderのコンストラクターに渡された JVMS ClassFile 構造体を、指定された訪問者に訪問させます。- パラメーター:
classVisitor- このクラスを訪問しなければならない訪問者。parsingOptions- このクラスの解析に使用するオプション。SKIP_CODE、SKIP_DEBUG、SKIP_FRAMESまたはEXPAND_FRAMESの 1 つ以上。
accept
このClassReaderのコンストラクターに渡された JVMS ClassFile 構造体を、指定された訪問者に訪問させます。- パラメーター:
classVisitor- このクラスを訪問しなければならない訪問者。attributePrototypes- クラスの訪問中に解析する必要がある属性のプロトタイプ。型がプロトタイプの型と等しくない属性は解析されません。そのバイト配列値は変更されずに ClassWriter に渡されます。 この値に定数プールへの参照が含まれている場合、またはリーダーとライター間のクラスアダプターによって変換されたクラス要素との構文リンクまたはセマンティックリンクがある場合、これにより破損する可能性があります。parsingOptions- このクラスの解析に使用するオプション。SKIP_CODE、SKIP_DEBUG、SKIP_FRAMESまたはEXPAND_FRAMESの 1 つ以上。
readBytecodeInstructionOffset
protected void readBytecodeInstructionOffset(int bytecodeOffset) accept(ClassVisitor,int)で次にアクセスする命令のバイトコードオフセットを処理します。このメソッドは、命令の直前、関連するラベルとスタックマップフレーム (存在する場合) の前に呼び出されます。このメソッドのデフォルトの実装では何も行われません。サブクラスは、このメソッドをオーバーライドして可変フィールドに引数を格納することができます。これにより、MethodVisitorインスタンスは、アクセスされた各命令のバイトコードオフセットを取得できます (その場合、可変データに関連する通常の並行性の課題に対処する必要があります)。- パラメーター:
bytecodeOffset- 次にアクセスされる命令のバイトコードオフセット。
readLabel
指定されたバイトコードオフセットに対応するラベルを返します。このメソッドのデフォルトの実装は、指定されたオフセットがまだ作成されていない場合は、そのラベルを作成します。- パラメーター:
bytecodeOffset- メソッド内のバイトコードオフセット。labels- すでに作成されたラベル。オフセットでインデックス付けされます。bytecodeOffset のラベルがすでに存在する場合、このメソッドは新しいラベルを作成してはいけません。それ以外の場合は、新しいラベルをこの配列に格納する必要があります。- 戻り値:
- 非 null ラベル。labels[bytecodeOffset] と等しい必要があります。
getItemCount
public int getItemCount()クラスの定数プールテーブルのエントリ数を返します。- 戻り値:
- クラスの定数プールテーブル内のエントリの数。
getItem
public int getItem(int constantPoolEntryIndex) このClassReaderの JVMS 'cp_info' 構造(つまり、定数プールエントリ)の開始オフセットに 1 を加えた値を返します。 このメソッドはAttributeサブクラスを対象としており、通常、クラスジェネレーターやアダプターでは必要ありません。- パラメーター:
constantPoolEntryIndex- クラスの定数プールテーブルの定数プールエントリのインデックス。- 戻り値:
- 対応する JVMS 'cp_info' 構造のこの
ClassReaderの開始オフセット + 1
getMaxStringLength
public int getMaxStringLength()クラスの定数プールテーブルに含まれる文字列の最大長の控えめな見積もりを返します。- 戻り値:
- クラスの定数プールテーブルに含まれる文字列の最大長の控えめな見積もり。
readByte
public int readByte(int offset) このClassReaderのバイト値を読み取ります。 このメソッドはAttributeサブクラスを対象としており、通常、クラスジェネレーターやアダプターでは必要ありません。- パラメーター:
offset- このClassReaderで読み取る値の開始オフセット- 戻り値:
- 読み取られた値。
readUnsignedShort
public int readUnsignedShort(int offset) このClassReaderの符号なし short 値を読み取ります。 このメソッドはAttributeサブクラスを対象としており、通常、クラスジェネレーターやアダプターでは必要ありません。- パラメーター:
offset- このClassReaderで読み取られる値の開始インデックス- 戻り値:
- 読み取られた値。
readShort
public short readShort(int offset) このClassReaderの符号付き short 値を読み取ります。 このメソッドはAttributeサブクラスを対象としており、通常、クラスジェネレーターやアダプターでは必要ありません。- パラメーター:
offset- このClassReaderで読み取る値の開始オフセット- 戻り値:
- 読み取られた値。
readInt
public int readInt(int offset) このClassReaderの signedint 値を読み取ります。 このメソッドはAttributeサブクラスを対象としており、通常、クラスジェネレーターまたはアダプターには必要ありません。- パラメーター:
offset- このClassReaderで読み取る値の開始オフセット- 戻り値:
- 読み取られた値。
readLong
public long readLong(int offset) このClassReaderの符号付き long 値を読み取ります。 このメソッドはAttributeサブクラスを対象としており、通常、クラスジェネレーターまたはアダプターには必要ありません。- パラメーター:
offset- このClassReaderで読み取る値の開始オフセット- 戻り値:
- 読み取られた値。
readUTF8
このClassReaderの CONSTANT_Utf8 定数プールエントリを読み取ります。 このメソッドはAttributeサブクラスを対象としており、通常、クラスジェネレーターまたはアダプターには必要ありません。- パラメーター:
offset- このClassReaderの符号なしショート値の開始オフセット。この値は、クラスの定数プールテーブルの CONSTANT_Utf8 エントリのインデックスです。charBuffer- 文字列の読み取りに使用されるバッファ。このバッファは十分に大きくなければなりません。自動的にサイズ変更されることはありません。- 戻り値:
- 指定された CONSTANT_Utf8 エントリに対応する文字列。
readClass
このClassReaderの CONSTANT_Class 定数プールエントリを読み取ります。 このメソッドはAttributeサブクラスを対象としており、通常、クラスジェネレーターまたはアダプターには必要ありません。- パラメーター:
offset- このClassReaderの符号なしショート値の開始オフセット。この値は、クラスの定数プールテーブルの CONSTANT_Class エントリのインデックスです。charBuffer- アイテムの読み取りに使用されるバッファー。このバッファは十分に大きくなければなりません。自動的にサイズ変更されることはありません。- 戻り値:
- 指定された CONSTANT_Class エントリに対応する文字列。
readModule
このClassReaderの CONSTANT_Module 定数プールエントリを読み取ります。 このメソッドはAttributeサブクラスを対象としており、通常、クラスジェネレーターまたはアダプターには必要ありません。- パラメーター:
offset- このClassReaderの符号なしショート値の開始オフセット。この値は、クラスの定数プールテーブルの CONSTANT_Module エントリのインデックスです。charBuffer- アイテムの読み取りに使用されるバッファー。このバッファは十分に大きくなければなりません。自動的にサイズ変更されることはありません。- 戻り値:
- 指定された CONSTANT_Module エントリに対応する文字列。
readPackage
このClassReaderの CONSTANT_Package 定数プールエントリを読み取ります。 このメソッドはAttributeサブクラスを対象としており、通常、クラスジェネレーターまたはアダプターには必要ありません。- パラメーター:
offset- このClassReaderの符号なしショート値の開始オフセット。この値は、クラスの定数プールテーブルの CONSTANT_Package エントリのインデックスです。charBuffer- アイテムの読み取りに使用されるバッファー。このバッファは十分に大きくなければなりません。自動的にサイズ変更されることはありません。- 戻り値:
- 指定された CONSTANT_Package エントリに対応する文字列。
readConst
このClassReaderの数値または文字列定数プールエントリを読み取ります。 このメソッドはAttributeサブクラスを対象としており、通常、クラスジェネレーターまたはアダプターには必要ありません。- パラメーター:
constantPoolEntryIndex- クラスの定数プール内の CONSTANT_Integer、CONSTANT_Float、CONSTANT_Long、CONSTANT_Double、CONSTANT_Class、CONSTANT_String、CONSTANT_MethodType、CONSTANT_MethodHandle、CONSTANT_Dynamic エントリのインデックス。charBuffer- 文字列の読み取りに使用されるバッファ。このバッファは十分に大きくなければなりません。自動的にサイズ変更されることはありません。- 戻り値:
- 指定された定数プールエントリに対応する
IntegerSE、FloatSE、LongSE、DoubleSE、StringSE、Type、Handle、ConstantDynamic。
readByte(int)およびその他の読み取り方法を使用してください。