public class ClassWriter extends ClassVisitor
ClassVisitor
。これを単独で使用して、「ゼロから」Java クラスを生成するか、1 つ以上の ClassReader
およびアダプター ClassVisitor
を使用して、1 つ以上の既存の Java クラスから変更されたクラスを生成できます。修飾子と型 | フィールドと説明 |
---|---|
static int | COMPUTE_FRAMES メソッドのスタックマップフレームを最初から自動的に計算するためのフラグ。 |
static int | COMPUTE_MAXS メソッドの最大スタックサイズとローカル変数の最大数を自動的に計算するためのフラグ。 |
api, cv
コンストラクターと説明 |
---|
ClassWriter(ClassReader classReader, int flags) 新しい ClassWriter オブジェクトを構築し、「ほとんど追加」するバイトコード変換の最適化を有効にします。 |
ClassWriter(int flags) 新しい ClassWriter オブジェクトを構築します。 |
修飾子と型 | メソッドと説明 |
---|---|
protected ClassLoaderSE | getClassLoader() getCommonSuperClass(String, String) のデフォルト実装で使用される ClassLoader SE を返します。デフォルトでは、この ClassWriter のランタイム型の実装です。 |
protected StringSE | getCommonSuperClass(StringSE type1, StringSE type2) 指定された 2 つの型の共通のスーパー型を返します。 |
boolean | hasFlags(int flags) 指定されたすべてのフラグがコンストラクターに渡された場合は true を返します。 |
int | newClass(StringSE value) ビルドされるクラスの定数プールにクラス参照を追加します。 |
int | newConst(ObjectSE value) ビルドされるクラスの定数プールに数値または文字列定数を追加します。 |
int | newConstantDynamic(StringSE name, StringSE descriptor, Handle bootstrapMethodHandle, ObjectSE... bootstrapMethodArguments) ビルドされるクラスの定数プールに動的定数参照を追加します。 |
int | newField(StringSE owner, StringSE name, StringSE descriptor) ビルドされるクラスの定数プールにフィールド参照を追加します。 |
int | newHandle(int tag, StringSE owner, StringSE name, StringSE descriptor) 使用すべきではありません。 このメソッドは newHandle(int, String, String, String, boolean) に取って代わりました。 |
int | newHandle(int tag, StringSE owner, StringSE name, StringSE descriptor, boolean isInterface) ビルドされるクラスの定数プールにハンドルを追加します。 |
int | newInvokeDynamic(StringSE name, StringSE descriptor, Handle bootstrapMethodHandle, ObjectSE... bootstrapMethodArguments) ビルドされるクラスの定数プールに invokedynamic 参照を追加します。 |
int | newMethod(StringSE owner, StringSE name, StringSE descriptor, boolean isInterface) ビルドされるクラスの定数プールにメソッド参照を追加します。 |
int | newMethodType(StringSE methodDescriptor) ビルドされるクラスの定数プールにメソッド型参照を追加します。 |
int | newModule(StringSE moduleName) ビルドされるクラスの定数プールにモジュール参照を追加します。 |
int | newNameType(StringSE name, StringSE descriptor) ビルドするクラスの定数プールに名前と型を追加します。 |
int | newPackage(StringSE packageName) ビルドされるクラスの定数プールにパッケージ参照を追加します。 |
int | newUTF8(StringSE value) ビルドされるクラスの定数プールに UTF8 文字列を追加します。 |
byte[] | toByteArray() この ClassWriter によって構築されたクラスファイルの内容を返します。 |
void | visit(int version, int access, StringSE name, StringSE signature, StringSE superName, StringSE[] interfaces) クラスのヘッダーにアクセスします。 |
AnnotationVisitor | visitAnnotation(StringSE descriptor, boolean visible) クラスのアノテーションにアクセスします。 |
void | visitAttribute(Attribute attribute) クラスの非標準属性を訪問します。 |
void | visitEnd() クラスの最後を訪問します。 |
FieldVisitor | visitField(int access, StringSE name, StringSE descriptor, StringSE signature, ObjectSE value) クラスのフィールドを訪問します。 |
void | visitInnerClass(StringSE name, StringSE outerName, StringSE innerName, int access) 内部クラスに関する情報を訪問します。 |
MethodVisitor | visitMethod(int access, StringSE name, StringSE descriptor, StringSE signature, StringSE[] exceptions) クラスのメソッドを訪問します。 |
ModuleVisitor | visitModule(StringSE name, int access, StringSE version) クラスに対応するモジュールにアクセスしてください。 |
void | visitNestHost(StringSE nestHost) クラスのネストホストクラスを訪問します。 |
void | visitNestMember(StringSE nestMember) 巣のメンバーを訪問します。 |
void | visitOuterClass(StringSE owner, StringSE name, StringSE descriptor) クラスの外側のクラスを訪問します。 |
void | visitPermittedSubclass(StringSE permittedSubclass) 許可されたサブクラスにアクセスします。 |
RecordComponentVisitor | visitRecordComponent(StringSE name, StringSE descriptor, StringSE signature) クラスのレコードコンポーネントを訪問します。 |
void | visitSource(StringSE file, StringSE debug) クラスのソースを訪問します。 |
AnnotationVisitor | visitTypeAnnotation(int typeRef, TypePath typePath, StringSE descriptor, boolean visible) クラスシグネチャーの型のアノテーションにアクセスします。 |
getDelegate
cloneSE, equalsSE, finalizeSE, getClassSE, hashCodeSE, notifySE, notifyAllSE, toStringSE, waitSE, waitSE, waitSE
public static final int COMPUTE_MAXS
visitMethod(int, java.lang.String, java.lang.String, java.lang.String, java.lang.String[])
メソッドによって返される MethodVisitor
の MethodVisitor.visitMaxs(int, int)
メソッドの引数は無視され、各メソッドのシグネチャーとバイトコードから自動的に計算されます。 注意 : バージョンが Opcodes.V1_7
以上のクラスの場合、このオプションには有効なスタックマップフレームが必要です。次に、最大スタックサイズがこれらのフレームから、およびその間のバイトコード命令から計算されます。スタックマップフレームが存在しないか、再計算する必要がある場合は、代わりに COMPUTE_FRAMES
を使用してください。
ClassWriter(int)
, 定数フィールド値 public static final int COMPUTE_FRAMES
MethodVisitor.visitFrame(int, int, java.lang.Object[], int, java.lang.Object[])
メソッドの呼び出しは無視され、スタックマップフレームはメソッドのバイトコードから再計算されます。MethodVisitor.visitMaxs(int, int)
メソッドの引数も無視され、バイトコードから再計算されます。つまり、COMPUTE_FRAMES
は COMPUTE_MAXS
を意味します。ClassWriter(int)
, 定数フィールド値 public ClassWriter(int flags)
ClassWriter
オブジェクトを構築します。flags
- このクラスのデフォルトの動作を変更するために使用できるオプションフラグ。COMPUTE_MAXS
および COMPUTE_FRAMES
のゼロ以上である必要があります。public ClassWriter(ClassReader classReader, int flags)
ClassWriter
オブジェクトを構築し、「ほとんど追加」するバイトコード変換の最適化を有効にします。これらの最適化は次のとおりです。ClassReader
が ClassWriter
(および他の ClassVisitor
インスタンスからではない)からの MethodVisitor
オブジェクトを受け取るという事実によって検出されます。classReader
- 元のクラスを読み取るために使用された ClassReader
これは、元のクラスから定数プールとブートストラップメソッド全体をコピーするため、および該当する場合は元のバイトコードの他のフラグメントをコピーするために使用されます。flags
- このクラスのデフォルトの動作を変更するために使用できるオプションフラグ。COMPUTE_MAXS
および COMPUTE_FRAMES
のゼロ以上である必要があります。 これらのオプションフラグは、新しいクラスにそのままコピーされるメソッドには影響しません。つまり、これらのメソッドでは、最大スタックサイズもスタックフレームも計算されません。public boolean hasFlags(int flags)
flags
- いくつかのオプションフラグ。COMPUTE_MAXS
と COMPUTE_FRAMES
のゼロ以上である必要があります。public final void visit(int version, int access, StringSE name, StringSE signature, StringSE superName, StringSE[] interfaces)
ClassVisitor
ClassVisitor
の visit
version
- クラスのバージョン。マイナーバージョンは上位 16 ビットに格納され、メジャーバージョンは下位 16 ビットに格納されます。access
- クラスのアクセスフラグ(Opcodes
を参照)。このパラメーターは、クラスが非推奨の Opcodes.ACC_DEPRECATED
であるかレコード Opcodes.ACC_RECORD
であるかも示します。name
- クラスの内部名(Type.getInternalName()
を参照)signature
- このクラスの署名。クラスが総称クラスではなく、総称クラスまたはインターフェースを継承または実装しない場合、null になることがあります。superName
- スーパークラスの内部名(Type.getInternalName()
を参照)インターフェースの場合、スーパークラスは Object
SE です。null の可能性がありますが、Object
SE クラスの場合のみです。interfaces
- クラスのインターフェースの内部名(Type.getInternalName()
を参照) null の可能性があります。public final void visitSource(StringSE file, StringSE debug)
ClassVisitor
ClassVisitor
の visitSource
file
- クラスのコンパイル元のソースファイルの名前。null の可能性があります。debug
- クラスのソース要素とコンパイル済み要素の間の対応を計算するための追加のデバッグ情報。null の可能性があります。public final ModuleVisitor visitModule(StringSE name, int access, StringSE version)
ClassVisitor
ClassVisitor
の visitModule
name
- モジュールの完全修飾名(ドットを使用)。access
- ACC_OPEN
、ACC_SYNTHETIC
、ACC_MANDATED
の中で、モジュールアクセスフラグ。version
- モジュールのバージョン、または null。public final void visitNestHost(StringSE nestHost)
ClassVisitor
ClassVisitor
の visitNestHost
nestHost
- ネストのホストクラスの内部名 ( Type.getInternalName()
を参照)。public final void visitOuterClass(StringSE owner, StringSE name, StringSE descriptor)
ClassVisitor
ClassVisitor
の visitOuterClass
owner
- クラスを囲むクラスの内部名 ( Type.getInternalName()
を参照)。name
- クラスを含むメソッドの名前、またはクラスがそれを囲むクラスのメソッドまたはコンストラクターで囲まれていない場合 (たとえば、インスタンス初期化子、静的初期化子、インスタンス変数初期化子、クラス変数初期化子で囲まれている場合) は null .descriptor
- クラスを含むメソッドの記述子、またはクラスがそれを囲むクラスのメソッドまたはコンストラクターで囲まれていない場合 (たとえば、インスタンス初期化子、静的初期化子、インスタンス変数初期化子、クラス変数初期化子で囲まれている場合) は null .public final AnnotationVisitor visitAnnotation(StringSE descriptor, boolean visible)
ClassVisitor
ClassVisitor
の visitAnnotation
descriptor
- アノテーションクラスのクラス記述子。visible
- 実行時にアノテーションが表示される場合は true。public final AnnotationVisitor visitTypeAnnotation(int typeRef, TypePath typePath, StringSE descriptor, boolean visible)
ClassVisitor
ClassVisitor
の visitTypeAnnotation
typeRef
- アノテーション付きの型への参照。この型参照の種類は、TypeReference.CLASS_TYPE_PARAMETER
、TypeReference.CLASS_TYPE_PARAMETER_BOUND
または TypeReference.CLASS_EXTENDS
でなければなりません。TypeReference
を参照してください。typePath
- 'typeRef' 内のアノテーション付き型引数、ワイルドカード境界、配列要素型、静的内部型へのパス。アノテーションが 'typeRef' 全体を対象とする場合は null になることがあります。descriptor
- アノテーションクラスのクラス記述子。visible
- 実行時にアノテーションが表示される場合は true。public final void visitAttribute(Attribute attribute)
ClassVisitor
ClassVisitor
の visitAttribute
attribute
- 属性。public final void visitNestMember(StringSE nestMember)
ClassVisitor
ClassVisitor
の visitNestMember
nestMember
- ネストメンバーの内部名 ( Type.getInternalName()
を参照)。public final void visitPermittedSubclass(StringSE permittedSubclass)
ClassVisitor
ClassVisitor
の visitPermittedSubclass
permittedSubclass
- 許可されたサブクラスの内部名 ( Type.getInternalName()
を参照)。public final void visitInnerClass(StringSE name, StringSE outerName, StringSE innerName, int access)
ClassVisitor
ClassVisitor
の visitInnerClass
name
- C の内部名 ( Type.getInternalName()
を参照)。outerName
- C がメンバーであるクラスまたはインターフェースの内部名 ( Type.getInternalName()
を参照)。C がクラスまたはインターフェースのメンバーでない場合 (ローカルクラスまたは匿名クラスなど)、null にする必要があります。innerName
- C の (単純な) 名前。匿名内部クラスの場合は null でなければなりません。access
- このクラスのコンパイル元のソースコードで最初に宣言された C のアクセスフラグ。public final RecordComponentVisitor visitRecordComponent(StringSE name, StringSE descriptor, StringSE signature)
ClassVisitor
ClassVisitor
の visitRecordComponent
name
- レコードコンポーネント名。descriptor
- レコードコンポーネント記述子(Type
を参照)signature
- レコードコンポーネントの署名。レコードコンポーネント型がジェネリクス型を使用しない場合、null になることがあります。public final FieldVisitor visitField(int access, StringSE name, StringSE descriptor, StringSE signature, ObjectSE value)
ClassVisitor
ClassVisitor
の visitField
access
- フィールドのアクセスフラグ(Opcodes
を参照)このパラメーターは、フィールドが合成か非推奨か、あるいはその両方かを示します。name
- フィールドの名前。descriptor
- フィールドの記述子(Type
を参照)signature
- フィールドの署名。フィールドの型がジェネリクス型を使用しない場合、null になることがあります。value
- フィールドの初期値。このパラメーターは、フィールドに初期値がない場合は null になる可能性があり、Integer
SE、Float
SE、Long
SE、Double
SE、String
SE(それぞれ int
、float
、long
または String
フィールドの場合)でなければなりません。 このパラメーターは静的フィールドにのみ使用されます。非静的フィールドの場合、その値は無視されます。これは、コンストラクターまたはメソッドのバイトコード命令によって初期化する必要があります。public final MethodVisitor visitMethod(int access, StringSE name, StringSE descriptor, StringSE signature, StringSE[] exceptions)
ClassVisitor
MethodVisitor
インスタンス(または null)を返す必要があります。つまり、以前に返されたビジターを返しません。ClassVisitor
の visitMethod
access
- メソッドのアクセスフラグ(Opcodes
を参照)このパラメーターは、メソッドが合成であるか、非推奨であるかを示します。name
- メソッドの名前。descriptor
- メソッドの記述子(Type
を参照)signature
- メソッドの署名。メソッドのパラメーター、戻り値の型、例外がジェネリクス型を使用しない場合、null になることがあります。exceptions
- メソッドの例外クラスの内部名(Type.getInternalName()
を参照) null の可能性があります。public final void visitEnd()
ClassVisitor
ClassVisitor
の visitEnd
public byte[] toByteArray()
ClassTooLargeException
- クラスの定数プールが大きすぎる場合。MethodTooLargeException
- メソッドのコード属性が大きすぎる場合。public int newConst(ObjectSE value)
Attribute
サブクラスを対象としており、通常、クラスジェネレーターやアダプターでは必要ありません。public int newUTF8(StringSE value)
Attribute
サブクラスを対象としており、通常、クラスジェネレーターやアダプターでは必要ありません。value
- 文字列値。public int newClass(StringSE value)
Attribute
サブクラスを対象としており、通常、クラスジェネレーターやアダプターでは必要ありません。value
- クラスの内部名(Type.getInternalName()
を参照)public int newMethodType(StringSE methodDescriptor)
Attribute
サブクラスを対象としており、通常、クラスジェネレーターやアダプターでは必要ありません。methodDescriptor
- メソッド型のメソッド記述子。public int newModule(StringSE moduleName)
Attribute
サブクラスを対象としており、通常、クラスジェネレーターやアダプターでは必要ありません。moduleName
- モジュールの名前。public int newPackage(StringSE packageName)
Attribute
サブクラスを対象としており、通常、クラスジェネレーターやアダプターでは必要ありません。packageName
- 内部形式でのパッケージの名前。@DeprecatedSE public int newHandle(int tag, StringSE owner, StringSE name, StringSE descriptor)
newHandle(int, String, String, String, boolean)
に置き換えられました。Attribute
サブクラスを対象としており、通常、クラスジェネレーターやアダプターでは必要ありません。tag
- このハンドルの種類。Opcodes.H_GETFIELD
、Opcodes.H_GETSTATIC
、Opcodes.H_PUTFIELD
、Opcodes.H_PUTSTATIC
、Opcodes.H_INVOKEVIRTUAL
、Opcodes.H_INVOKESTATIC
、Opcodes.H_INVOKESPECIAL
、Opcodes.H_NEWINVOKESPECIAL
、Opcodes.H_INVOKEINTERFACE
である必要があります。owner
- フィールドまたはメソッド所有者クラスの内部名 ( Type.getInternalName()
を参照)。name
- フィールドまたはメソッドの名前。descriptor
- フィールドまたはメソッドの記述子。public int newHandle(int tag, StringSE owner, StringSE name, StringSE descriptor, boolean isInterface)
Attribute
サブクラスを対象としており、通常、クラスジェネレーターやアダプターでは必要ありません。tag
- このハンドルの種類。Opcodes.H_GETFIELD
、Opcodes.H_GETSTATIC
、Opcodes.H_PUTFIELD
、Opcodes.H_PUTSTATIC
、Opcodes.H_INVOKEVIRTUAL
、Opcodes.H_INVOKESTATIC
、Opcodes.H_INVOKESPECIAL
、Opcodes.H_NEWINVOKESPECIAL
、Opcodes.H_INVOKEINTERFACE
である必要があります。owner
- フィールドまたはメソッド所有者クラスの内部名 ( Type.getInternalName()
を参照)。name
- フィールドまたはメソッドの名前。descriptor
- フィールドまたはメソッドの記述子。isInterface
- 所有者がインターフェースの場合は true。public int newConstantDynamic(StringSE name, StringSE descriptor, Handle bootstrapMethodHandle, ObjectSE... bootstrapMethodArguments)
Attribute
サブクラスを対象としており、通常、クラスジェネレーターやアダプターでは必要ありません。name
- 呼び出されたメソッドの名前。descriptor
- 定数型のフィールド記述子。bootstrapMethodHandle
- ブートストラップメソッド。bootstrapMethodArguments
- ブートストラップメソッド定数引数。public int newInvokeDynamic(StringSE name, StringSE descriptor, Handle bootstrapMethodHandle, ObjectSE... bootstrapMethodArguments)
Attribute
サブクラスを対象としており、通常、クラスジェネレーターやアダプターでは必要ありません。name
- 呼び出されたメソッドの名前。descriptor
- invoke メソッドの記述子。bootstrapMethodHandle
- ブートストラップメソッド。bootstrapMethodArguments
- ブートストラップメソッド定数引数。public int newField(StringSE owner, StringSE name, StringSE descriptor)
Attribute
サブクラスを対象としており、通常、クラスジェネレーターやアダプターでは必要ありません。owner
- フィールドの所有者クラスの内部名(Type.getInternalName()
を参照)。name
- フィールドの名前。descriptor
- フィールドの記述子。public int newMethod(StringSE owner, StringSE name, StringSE descriptor, boolean isInterface)
Attribute
サブクラスを対象としており、通常、クラスジェネレーターやアダプターでは必要ありません。owner
- メソッドの所有者クラスの内部名(Type.getInternalName()
を参照)。name
- メソッドの名前。descriptor
- メソッドの記述子。isInterface
- owner
がインターフェースの場合は true。public int newNameType(StringSE name, StringSE descriptor)
Attribute
サブクラスを対象としており、通常、クラスジェネレーターやアダプターでは必要ありません。name
- 名前。descriptor
- 型記述子。protected StringSE getCommonSuperClass(StringSE type1, StringSE type2)
type1
- クラスの内部名 ( Type.getInternalName()
を参照)。type2
- 別のクラスの内部名 ( Type.getInternalName()
を参照)。Type.getInternalName()
を参照)。protected ClassLoaderSE getClassLoader()
getCommonSuperClass(String, String)
のデフォルト実装で使用される ClassLoader
SE を返します。デフォルトでは、この ClassWriter
のランタイム型の実装です。