パッケージ org.springframework.asm

クラス ClassWriter


public class ClassWriter extends ClassVisitor
Java 仮想マシン仕様(JVMS)で定義されている、対応する ClassFile 構造を生成する ClassVisitor。これを単独で使用して、「ゼロから」Java クラスを生成するか、1 つ以上の ClassReader およびアダプター ClassVisitor を使用して、1 つ以上の既存の Java クラスから変更されたクラスを生成できます。
作成者:
Eric Bruneton
関連事項:
  • フィールドの詳細

  • コンストラクターの詳細

    • ClassWriter

      public ClassWriter(int flags)
      新しい ClassWriter オブジェクトを構築します。
      パラメーター:
      flags - このクラスのデフォルトの動作を変更するために使用できるオプションフラグ。COMPUTE_MAXS および COMPUTE_FRAMES のゼロ以上である必要があります。
    • ClassWriter

      public ClassWriter(ClassReader classReader, int flags)
      新しい ClassWriter オブジェクトを構築し、「ほとんど追加」するバイトコード変換の最適化を有効にします。これらの最適化は次のとおりです。
      • 元のクラスの定数プールおよびブートストラップメソッドは、新しいクラスにそのままコピーされるため、時間を節約できます。必要に応じて、新しい定数プールエントリと新しいブートストラップメソッドが最後に追加されますが、未使用の定数プールエントリまたはブートストラップメソッドは削除されません
      • 変換されないメソッドは、元のクラスのバイトコードから直接(つまり、すべてのメソッド命令の訪問イベントを発行せずに)新しいクラスにそのままコピーされるため、時間を大幅に節約できます。変換されていないメソッドは、ClassReaderClassWriter(および他の ClassVisitor インスタンスからではない)からの MethodVisitor オブジェクトを受け取るという事実によって検出されます。
      パラメーター:
      classReader - 元のクラスを読み取るために使用された ClassReader これは、元のクラスから定数プールとブートストラップメソッド全体をコピーするため、および該当する場合は元のバイトコードの他のフラグメントをコピーするために使用されます。
      flags - このクラスのデフォルトの動作を変更するために使用できるオプションフラグ。COMPUTE_MAXS および COMPUTE_FRAMES のゼロ以上である必要があります。 これらのオプションフラグは、新しいクラスにそのままコピーされるメソッドには影響しません。つまり、これらのメソッドでは、最大スタックサイズもスタックフレームも計算されません
  • メソッドの詳細

    • hasFlags

      public boolean hasFlags(int flags)
      指定されたすべてのフラグがコンストラクターに渡された場合は true を返します。
      パラメーター:
      flags - いくつかのオプションフラグ。COMPUTE_MAXSCOMPUTE_FRAMES のゼロ以上である必要があります。
      戻り値:
      指定されたすべてのフラグ、またはそれ以上がコンストラクターに渡された場合は true。
    • visit

      public final void visit(int version, int access, StringSE name, StringSE signature, StringSE superName, StringSE[] interfaces)
      クラスからコピーされた説明: ClassVisitor
      クラスのヘッダーにアクセスします。
      オーバーライド:
      クラス ClassVisitorvisit 
      パラメーター:
      version - クラスのバージョン。マイナーバージョンは上位 16 ビットに格納され、メジャーバージョンは下位 16 ビットに格納されます。
      access - クラスのアクセスフラグ(Opcodes を参照)。このパラメーターは、クラスが非推奨の Opcodes.ACC_DEPRECATED であるかレコード Opcodes.ACC_RECORD であるかも示します。
      name - クラスの内部名(Type.getInternalName() を参照)
      signature - このクラスの署名。クラスが総称クラスではなく、総称クラスまたはインターフェースを継承または実装しない場合、null になることがあります。
      superName - スーパークラスの内部名(Type.getInternalName() を参照)インターフェースの場合、スーパークラスは ObjectSE です。null の可能性がありますが、ObjectSE クラスの場合のみです。
      interfaces - クラスのインターフェースの内部名(Type.getInternalName() を参照) null の可能性があります。
    • visitSource

      public final void visitSource(StringSE file, StringSE debug)
      クラスからコピーされた説明: ClassVisitor
      クラスのソースを訪問します。
      オーバーライド:
      クラス ClassVisitorvisitSource 
      パラメーター:
      file - クラスのコンパイル元のソースファイルの名前。null の可能性があります。
      debug - クラスのソース要素とコンパイル済み要素の間の対応を計算するための追加のデバッグ情報。null の可能性があります。
    • visitModule

      public final ModuleVisitor visitModule(StringSE name, int access, StringSE version)
      クラスからコピーされた説明: ClassVisitor
      クラスに対応するモジュールにアクセスしてください。
      オーバーライド:
      クラス ClassVisitorvisitModule 
      パラメーター:
      name - モジュールの完全修飾名(ドットを使用)。
      access - ACC_OPENACC_SYNTHETIC ACC_MANDATED の中で、モジュールアクセスフラグ。
      version - モジュールのバージョン、または null。
      戻り値:
      モジュールの値を訪問する訪問者。この訪問者がこのモジュールの訪問に興味がない場合は null。
    • visitNestHost

      public final void visitNestHost(StringSE nestHost)
      クラスからコピーされた説明: ClassVisitor
      クラスのネストホストクラスを訪問します。ネストは、プライベートメンバーへのアクセスを共有する同じパッケージのクラスのセットです。これらのクラスの 1 つは、ホストと呼ばれ、ネストの他のメンバーをリストします。次に、それらのメンバーは、ネストのホストにリンクする必要があります。このメソッドは、訪問したクラスがネストの非ホストメンバーである場合にのみ、一度だけ呼び出す必要があります。クラスは暗黙的に独自のネストであるため、訪問したクラス名を引数としてこのメソッドを呼び出すことは無効です。
      オーバーライド:
      クラス ClassVisitorvisitNestHost 
      パラメーター:
      nestHost - ネストのホストクラスの内部名 ( Type.getInternalName() を参照)。
    • visitOuterClass

      public final void visitOuterClass(StringSE owner, StringSE name, StringSE descriptor)
      クラスからコピーされた説明: ClassVisitor
      クラスの外側のクラスにアクセスします。このメソッドは、このクラスがローカルクラスまたは匿名クラスである場合にのみ呼び出す必要があります。詳細については、JVMS 4.7.7 セクションを参照してください。
      オーバーライド:
      クラス ClassVisitorvisitOuterClass 
      パラメーター:
      owner - クラスを囲むクラスの内部名 ( Type.getInternalName() を参照)。
      name - クラスを含むメソッドの名前、またはクラスがそれを囲むクラスのメソッドまたはコンストラクターで囲まれていない場合 (たとえば、インスタンス初期化子、静的初期化子、インスタンス変数初期化子、クラス変数初期化子で囲まれている場合) は null .
      descriptor - クラスを含むメソッドの記述子、またはクラスがそれを囲むクラスのメソッドまたはコンストラクターで囲まれていない場合 (たとえば、インスタンス初期化子、静的初期化子、インスタンス変数初期化子、クラス変数初期化子で囲まれている場合) は null .
    • visitAnnotation

      public final AnnotationVisitor visitAnnotation(StringSE descriptor, boolean visible)
      クラスからコピーされた説明: ClassVisitor
      クラスのアノテーションにアクセスします。
      オーバーライド:
      クラス ClassVisitorvisitAnnotation 
      パラメーター:
      descriptor - アノテーションクラスのクラス記述子。
      visible - 実行時にアノテーションが表示される場合は true。
      戻り値:
      アノテーション値を訪問する訪問者。この訪問者がこのアノテーションの訪問に興味がない場合は null。
    • visitTypeAnnotation

      public final AnnotationVisitor visitTypeAnnotation(int typeRef, TypePath typePath, StringSE descriptor, boolean visible)
      クラスからコピーされた説明: ClassVisitor
      クラスシグネチャーの型のアノテーションにアクセスします。
      オーバーライド:
      クラス ClassVisitorvisitTypeAnnotation 
      パラメーター:
      typeRef - アノテーション付きの型への参照。この型参照の種類は、TypeReference.CLASS_TYPE_PARAMETERTypeReference.CLASS_TYPE_PARAMETER_BOUND または TypeReference.CLASS_EXTENDS でなければなりません。TypeReference を参照してください。
      typePath - 'typeRef' 内のアノテーション付き型引数、ワイルドカード境界、配列要素型、静的内部型へのパス。アノテーションが 'typeRef' 全体を対象とする場合は null になることがあります。
      descriptor - アノテーションクラスのクラス記述子。
      visible - 実行時にアノテーションが表示される場合は true。
      戻り値:
      アノテーション値を訪問する訪問者。この訪問者がこのアノテーションの訪問に興味がない場合は null。
    • visitAttribute

      public final void visitAttribute(Attribute attribute)
      クラスからコピーされた説明: ClassVisitor
      クラスの非標準属性を訪問します。
      オーバーライド:
      クラス ClassVisitorvisitAttribute 
      パラメーター:
      attribute - 属性。
    • visitNestMember

      public final void visitNestMember(StringSE nestMember)
      クラスからコピーされた説明: ClassVisitor
      巣のメンバーを訪問します。ネストは、プライベートメンバーへのアクセスを共有する同じパッケージのクラスのセットです。これらのクラスの 1 つは、ホストと呼ばれ、ネストの他のメンバーをリストします。次に、それらのメンバーは、ネストのホストにリンクする必要があります。このメソッドは、訪問したクラスがネストのホストである場合にのみ呼び出す必要があります。ネストホストは暗黙的にそれ自身のネストのメンバーであるため、訪問したクラス名を引数としてこのメソッドを呼び出すことは無効です。
      オーバーライド:
      クラス ClassVisitorvisitNestMember 
      パラメーター:
      nestMember - ネストメンバーの内部名 ( Type.getInternalName() を参照)。
    • visitPermittedSubclass

      public final void visitPermittedSubclass(StringSE permittedSubclass)
      クラスからコピーされた説明: ClassVisitor
      許可されたサブクラスにアクセスします。許可されたサブクラスは、現在のクラスで許可されているサブクラスの 1 つです。
      オーバーライド:
      クラス ClassVisitorvisitPermittedSubclass 
      パラメーター:
      permittedSubclass - 許可されたサブクラスの内部名 ( Type.getInternalName() を参照)。
    • visitInnerClass

      public final void visitInnerClass(StringSE name, StringSE outerName, StringSE innerName, int access)
      クラスからコピーされた説明: ClassVisitor
      内部クラスに関する情報にアクセスします。この内部クラスは、必ずしもアクセス対象のクラスのメンバーであるとは限りません。より正確には、このクラスによって参照され、パッケージメンバーではないすべてのクラスまたはインターフェース C は、このメソッドでアクセスする必要があります。このクラスは、ネストされたクラスまたはインターフェースメンバー、およびそれを囲むクラス (存在する場合) を参照する必要があります。詳細については、JVMS 4.7.6 セクションを参照してください。
      オーバーライド:
      クラス ClassVisitorvisitInnerClass 
      パラメーター:
      name - C の内部名 ( Type.getInternalName() を参照)。
      outerName - C がメンバーであるクラスまたはインターフェースの内部名 ( Type.getInternalName() を参照)。C がクラスまたはインターフェースのメンバーでない場合 (ローカルクラスまたは匿名クラスなど)、null にする必要があります。
      innerName - C の (単純な) 名前。匿名内部クラスの場合は null でなければなりません。
      access - このクラスのコンパイル元のソースコードで最初に宣言された C のアクセスフラグ。
    • visitRecordComponent

      public final RecordComponentVisitor visitRecordComponent(StringSE name, StringSE descriptor, StringSE signature)
      クラスからコピーされた説明: ClassVisitor
      クラスのレコードコンポーネントを訪問します。
      オーバーライド:
      クラス ClassVisitorvisitRecordComponent 
      パラメーター:
      name - レコードコンポーネント名。
      descriptor - レコードコンポーネント記述子(Type を参照)
      signature - レコードコンポーネントの署名。レコードコンポーネント型がジェネリクス型を使用しない場合、null になることがあります。
      戻り値:
      このレコードコンポーネントのアノテーションと属性にアクセスする訪問者。このクラスの訪問者がこれらのアノテーションと属性にアクセスすることに関心がない場合は null。
    • visitField

      public final FieldVisitor visitField(int access, StringSE name, StringSE descriptor, StringSE signature, ObjectSE value)
      クラスからコピーされた説明: ClassVisitor
      クラスのフィールドを訪問します。
      オーバーライド:
      クラス ClassVisitorvisitField 
      パラメーター:
      access - フィールドのアクセスフラグ(Opcodes を参照)このパラメーターは、フィールドが合成か非推奨か、あるいはその両方かを示します。
      name - フィールドの名前。
      descriptor - フィールドの記述子(Type を参照)
      signature - フィールドの署名。フィールドの型がジェネリクス型を使用しない場合、null になることがあります。
      value - フィールドの初期値。このパラメーターは、フィールドに初期値がない場合は null になる可能性があり、IntegerSEFloatSELongSEDoubleSEStringSE(それぞれ intfloatlong または String フィールドの場合)でなければなりません。 このパラメーターは静的フィールドにのみ使用されます。非静的フィールドの場合、その値は無視されます。これは、コンストラクターまたはメソッドのバイトコード命令によって初期化する必要があります。
      戻り値:
      フィールドのアノテーションと属性にアクセスする訪問者。このクラスの訪問者がこれらのアノテーションと属性にアクセスすることに関心がない場合は null。
    • visitMethod

      public final MethodVisitor visitMethod(int access, StringSE name, StringSE descriptor, StringSE signature, StringSE[] exceptions)
      クラスからコピーされた説明: ClassVisitor
      クラスのメソッドを訪問します。このメソッドは、呼び出されるたびに新しい MethodVisitor インスタンス(または null)を返す必要があります。つまり、以前に返されたビジターを返しません。
      オーバーライド:
      クラス ClassVisitorvisitMethod 
      パラメーター:
      access - メソッドのアクセスフラグ(Opcodes を参照)このパラメーターは、メソッドが合成であるか、非推奨であるかを示します。
      name - メソッドの名前。
      descriptor - メソッドの記述子(Type を参照)
      signature - メソッドの署名。メソッドのパラメーター、戻り値の型、例外がジェネリクス型を使用しない場合、null になることがあります。
      exceptions - メソッドの例外クラスの内部名(Type.getInternalName() を参照) null の可能性があります。
      戻り値:
      メソッドのバイトコードを訪問するオブジェクト。このクラスビジターがこのメソッドのコードを訪問することに関心がない場合は null。
    • visitEnd

      public final void visitEnd()
      クラスからコピーされた説明: ClassVisitor
      クラスの最後を訪問します。呼び出される最後のメソッドであるこのメソッドは、クラスのすべてのフィールドとメソッドが訪問されたことを訪問者に通知するために使用されます。
      オーバーライド:
      クラス ClassVisitorvisitEnd 
    • toByteArray

      public byte[] toByteArray()
      この ClassWriter によって構築されたクラスファイルの内容を返します。
      戻り値:
      この ClassWriter によって構築された JVMS ClassFile 構造のバイナリコンテンツ。
      例外:
      ClassTooLargeException - クラスの定数プールが大きすぎる場合。
      MethodTooLargeException - メソッドのコード属性が大きすぎる場合。
    • newConst

      public int newConst(ObjectSE value)
      ビルドされるクラスの定数プールに数値または文字列定数を追加します。定数プールにすでに同様のアイテムが含まれている場合は、何もしません。 このメソッドは Attribute サブクラスを対象としており、通常、クラスジェネレーターやアダプターでは必要ありません。
      パラメーター:
      value - 定数プールに追加される定数の値。このパラメーターは、IntegerSEFloatSELongSEDoubleSEStringSE でなければなりません。
      戻り値:
      指定された値を持つ新規または既存の定数項目のインデックス。
    • newUTF8

      public int newUTF8(StringSE value)
      ビルドされるクラスの定数プールに UTF8 文字列を追加します。定数プールにすでに同様のアイテムが含まれている場合は、何もしません。 このメソッドは Attribute サブクラスを対象としており、通常、クラスジェネレーターやアダプターでは必要ありません。
      パラメーター:
      value - 文字列値。
      戻り値:
      新規または既存の UTF8 アイテムのインデックス。
    • newClass

      public int newClass(StringSE value)
      ビルドされるクラスの定数プールにクラス参照を追加します。定数プールにすでに同様のアイテムが含まれている場合は、何もしません。 このメソッドは Attribute サブクラスを対象としており、通常、クラスジェネレーターやアダプターでは必要ありません。
      パラメーター:
      value - クラスの内部名(Type.getInternalName() を参照)
      戻り値:
      新規または既存のクラス参照アイテムのインデックス。
    • newMethodType

      public int newMethodType(StringSE methodDescriptor)
      ビルドされるクラスの定数プールにメソッド型の参照を追加します。定数プールにすでに同様のアイテムが含まれている場合は、何もしません。 このメソッドは Attribute サブクラスを対象としており、通常、クラスジェネレーターやアダプターでは必要ありません。
      パラメーター:
      methodDescriptor - メソッド型のメソッド記述子。
      戻り値:
      新規または既存のメソッド型参照項目のインデックス。
    • newModule

      public int newModule(StringSE moduleName)
      ビルドされるクラスの定数プールにモジュール参照を追加します。定数プールにすでに同様のアイテムが含まれている場合は、何もしません。 このメソッドは Attribute サブクラスを対象としており、通常、クラスジェネレーターやアダプターでは必要ありません。
      パラメーター:
      moduleName - モジュールの名前。
      戻り値:
      新規または既存のモジュール参照アイテムのインデックス。
    • newPackage

      public int newPackage(StringSE packageName)
      ビルドされるクラスの定数プールにパッケージ参照を追加します。定数プールにすでに同様のアイテムが含まれている場合は、何もしません。 このメソッドは Attribute サブクラスを対象としており、通常、クラスジェネレーターやアダプターでは必要ありません。
      パラメーター:
      packageName - 内部形式でのパッケージの名前。
      戻り値:
      新規または既存のモジュール参照アイテムのインデックス。
    • newHandle

      @DeprecatedSE public int newHandle(int tag, StringSE owner, StringSE name, StringSE descriptor)
      使用すべきではありません。
      このメソッドは newHandle(int, String, String, String, boolean) に取って代わりました。
      ビルドされるクラスの定数プールにハンドルを追加します。定数プールにすでに同様のアイテムが含まれている場合は、何もしません。 このメソッドは Attribute サブクラスを対象としており、通常、クラスジェネレーターやアダプターでは必要ありません。
      パラメーター:
      tag - このハンドルの種類。Opcodes.H_GETFIELDOpcodes.H_GETSTATICOpcodes.H_PUTFIELDOpcodes.H_PUTSTATICOpcodes.H_INVOKEVIRTUALOpcodes.H_INVOKESTATICOpcodes.H_INVOKESPECIALOpcodes.H_NEWINVOKESPECIALOpcodes.H_INVOKEINTERFACE である必要があります。
      owner - フィールドまたはメソッド所有者クラスの内部名 ( Type.getInternalName() を参照)。
      name - フィールドまたはメソッドの名前。
      descriptor - フィールドまたはメソッドの記述子。
      戻り値:
      新規または既存のメソッド型参照項目のインデックス。
    • newHandle

      public int newHandle(int tag, StringSE owner, StringSE name, StringSE descriptor, boolean isInterface)
      ビルドされるクラスの定数プールにハンドルを追加します。定数プールにすでに同様のアイテムが含まれている場合は、何もしません。 このメソッドは Attribute サブクラスを対象としており、通常、クラスジェネレーターやアダプターでは必要ありません。
      パラメーター:
      tag - このハンドルの種類。Opcodes.H_GETFIELDOpcodes.H_GETSTATICOpcodes.H_PUTFIELDOpcodes.H_PUTSTATICOpcodes.H_INVOKEVIRTUALOpcodes.H_INVOKESTATICOpcodes.H_INVOKESPECIALOpcodes.H_NEWINVOKESPECIALOpcodes.H_INVOKEINTERFACE である必要があります。
      owner - フィールドまたはメソッド所有者クラスの内部名 ( Type.getInternalName() を参照)。
      name - フィールドまたはメソッドの名前。
      descriptor - フィールドまたはメソッドの記述子。
      isInterface - 所有者がインターフェースの場合は true。
      戻り値:
      新規または既存のメソッド型参照項目のインデックス。
    • newConstantDynamic

      public int newConstantDynamic(StringSE name, StringSE descriptor, Handle bootstrapMethodHandle, ObjectSE... bootstrapMethodArguments)
      ビルドされるクラスの定数プールに動的定数参照を追加します。定数プールにすでに同様のアイテムが含まれている場合は、何もしません。 このメソッドは Attribute サブクラスを対象としており、通常、クラスジェネレーターやアダプターでは必要ありません。
      パラメーター:
      name - 呼び出されたメソッドの名前。
      descriptor - 定数型のフィールド記述子。
      bootstrapMethodHandle - ブートストラップメソッド。
      bootstrapMethodArguments - ブートストラップメソッド定数引数。
      戻り値:
      新規または既存の動的定数参照アイテムのインデックス。
    • newInvokeDynamic

      public int newInvokeDynamic(StringSE name, StringSE descriptor, Handle bootstrapMethodHandle, ObjectSE... bootstrapMethodArguments)
      ビルドされるクラスの定数プールに invokedynamic 参照を追加します。定数プールにすでに同様のアイテムが含まれている場合は、何もしません。 このメソッドは Attribute サブクラスを対象としており、通常、クラスジェネレーターやアダプターでは必要ありません。
      パラメーター:
      name - 呼び出されたメソッドの名前。
      descriptor - invoke メソッドの記述子。
      bootstrapMethodHandle - ブートストラップメソッド。
      bootstrapMethodArguments - ブートストラップメソッド定数引数。
      戻り値:
      新規または既存の invokedynamic 参照項目のインデックス。
    • newField

      public int newField(StringSE owner, StringSE name, StringSE descriptor)
      ビルドされるクラスの定数プールにフィールド参照を追加します。定数プールにすでに同様のアイテムが含まれている場合は、何もしません。 このメソッドは Attribute サブクラスを対象としており、通常、クラスジェネレーターやアダプターでは必要ありません。
      パラメーター:
      owner - フィールドの所有者クラスの内部名(Type.getInternalName() を参照)。
      name - フィールドの名前。
      descriptor - フィールドの記述子。
      戻り値:
      新規または既存のフィールド参照アイテムのインデックス。
    • newMethod

      public int newMethod(StringSE owner, StringSE name, StringSE descriptor, boolean isInterface)
      ビルドされるクラスの定数プールにメソッド参照を追加します。定数プールにすでに同様のアイテムが含まれている場合は、何もしません。 このメソッドは Attribute サブクラスを対象としており、通常、クラスジェネレーターやアダプターでは必要ありません。
      パラメーター:
      owner - メソッドの所有者クラスの内部名(Type.getInternalName() を参照)。
      name - メソッドの名前。
      descriptor - メソッドの記述子。
      isInterface - owner がインターフェースの場合は true。
      戻り値:
      新規または既存のメソッド参照アイテムのインデックス。
    • newNameType

      public int newNameType(StringSE name, StringSE descriptor)
      ビルドするクラスの定数プールに名前と型を追加します。定数プールにすでに同様のアイテムが含まれている場合は、何もしません。 このメソッドは Attribute サブクラスを対象としており、通常、クラスジェネレーターやアダプターでは必要ありません。
      パラメーター:
      name - 名前。
      descriptor - 型記述子。
      戻り値:
      新規または既存の名前と型のアイテムのインデックス。
    • getCommonSuperClass

      protected StringSE getCommonSuperClass(StringSE type1, StringSE type2)
      指定された 2 つの型の共通のスーパー型を返します。このメソッドのデフォルト実装は、指定された 2 つのクラスをロードし、java.lang.Class メソッドを使用して共通のスーパークラスを見つけます。他の方法で、特に実際にクラスをロードせずに、この共通のスーパー型を計算したり、この ClassWriter によって現在生成されているクラスを考慮に入れたりすることはオーバーライドできます。
      パラメーター:
      type1 - クラスの内部名 ( Type.getInternalName() を参照)。
      type2 - 別のクラスの内部名 ( Type.getInternalName() を参照)。
      戻り値:
      指定された 2 つのクラスの共通スーパークラスの内部名 ( Type.getInternalName() を参照)。
    • getClassLoader

      protected ClassLoaderSE getClassLoader()
      getCommonSuperClass(String, String) のデフォルト実装で使用される ClassLoaderSE を返します。デフォルトでは、この ClassWriter のランタイム型の実装です。
      戻り値:
      ClassLoader