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 java.lang.ClassLoader | getClassLoader()getCommonSuperClass(String, String) のデフォルトの実装で使用される ClassLoader を返します。これは、この ClassWriter のランタイム型のデフォルトの実装です。 |
protected java.lang.String | getCommonSuperClass(java.lang.String type1, java.lang.String type2) 指定された 2 つの型の共通のスーパー型を返します。 |
int | newClass(java.lang.String value) ビルドされるクラスの定数プールにクラス参照を追加します。 |
int | newConst(java.lang.Object value) ビルドされるクラスの定数プールに数値または文字列定数を追加します。 |
int | newConstantDynamic(java.lang.String name, java.lang.String descriptor, Handle bootstrapMethodHandle, java.lang.Object... bootstrapMethodArguments) ビルドされるクラスの定数プールに動的定数参照を追加します。 |
int | newField(java.lang.String owner, java.lang.String name, java.lang.String descriptor) ビルドされるクラスの定数プールにフィールド参照を追加します。 |
int | newHandle(int tag, java.lang.String owner, java.lang.String name, java.lang.String descriptor) 使用すべきではありません。 このメソッドは newHandle(int, String, String, String, boolean) に取って代わりました。 |
int | newHandle(int tag, java.lang.String owner, java.lang.String name, java.lang.String descriptor, boolean isInterface) ビルドされるクラスの定数プールにハンドルを追加します。 |
int | newInvokeDynamic(java.lang.String name, java.lang.String descriptor, Handle bootstrapMethodHandle, java.lang.Object... bootstrapMethodArguments) ビルドされるクラスの定数プールに invokedynamic 参照を追加します。 |
int | newMethod(java.lang.String owner, java.lang.String name, java.lang.String descriptor, boolean isInterface) ビルドされるクラスの定数プールにメソッド参照を追加します。 |
int | newMethodType(java.lang.String methodDescriptor) ビルドされるクラスの定数プールにメソッド型参照を追加します。 |
int | newModule(java.lang.String moduleName) ビルドされるクラスの定数プールにモジュール参照を追加します。 |
int | newNameType(java.lang.String name, java.lang.String descriptor) ビルドするクラスの定数プールに名前と型を追加します。 |
int | newPackage(java.lang.String packageName) ビルドされるクラスの定数プールにパッケージ参照を追加します。 |
int | newUTF8(java.lang.String value) ビルドされるクラスの定数プールに UTF8 文字列を追加します。 |
byte[] | toByteArray() この ClassWriter によって構築されたクラスファイルの内容を返します。 |
void | visit(int version, int access, java.lang.String name, java.lang.String signature, java.lang.String superName, java.lang.String[] interfaces) クラスのヘッダーにアクセスします。 |
AnnotationVisitor | visitAnnotation(java.lang.String descriptor, boolean visible) クラスのアノテーションにアクセスします。 |
void | visitAttribute(Attribute attribute) クラスの非標準属性を訪問します。 |
void | visitEnd() クラスの最後を訪問します。 |
FieldVisitor | visitField(int access, java.lang.String name, java.lang.String descriptor, java.lang.String signature, java.lang.Object value) クラスのフィールドを訪問します。 |
void | visitInnerClass(java.lang.String name, java.lang.String outerName, java.lang.String innerName, int access) 内部クラスに関する情報を訪問します。 |
MethodVisitor | visitMethod(int access, java.lang.String name, java.lang.String descriptor, java.lang.String signature, java.lang.String[] exceptions) クラスのメソッドを訪問します。 |
ModuleVisitor | visitModule(java.lang.String name, int access, java.lang.String version) クラスに対応するモジュールにアクセスしてください。 |
void | visitNestHost(java.lang.String nestHost) クラスのネストホストクラスを訪問します。 |
void | visitNestMember(java.lang.String nestMember) 巣のメンバーを訪問します。 |
void | visitOuterClass(java.lang.String owner, java.lang.String name, java.lang.String descriptor) クラスの外側のクラスを訪問します。 |
void | visitSource(java.lang.String file, java.lang.String debug) クラスのソースを訪問します。 |
AnnotationVisitor | visitTypeAnnotation(int typeRef, TypePath typePath, java.lang.String descriptor, boolean visible) クラスシグネチャーの型のアノテーションにアクセスします。 |
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 final void visit(int version,
int access,
java.lang.String name,
java.lang.String signature,
java.lang.String superName,
java.lang.String[] interfaces)ClassVisitorClassVisitor の visit version - クラスのバージョン。マイナーバージョンは上位 16 ビットに格納され、メジャーバージョンは下位 16 ビットに格納されます。access - クラスのアクセスフラグ(Opcodes を参照)このパラメーターは、クラスが非推奨かどうかも示します。name - クラスの内部名(Type.getInternalName() を参照)signature - このクラスの署名。クラスが総称クラスではなく、総称クラスまたはインターフェースを継承または実装しない場合、null になることがあります。superName - スーパークラスの名前の内部(Type.getInternalName() を参照)。インターフェースの場合、スーパークラスは Object です。null の場合がありますが、Object クラスの場合のみです。interfaces - クラスのインターフェースの内部名(Type.getInternalName() を参照) null の可能性があります。public final void visitSource(java.lang.String file,
java.lang.String debug)ClassVisitorClassVisitor の visitSource file - クラスのコンパイル元のソースファイルの名前。null の可能性があります。debug - クラスのソース要素とコンパイル済み要素の間の対応を計算するための追加のデバッグ情報。null の可能性があります。public final ModuleVisitor visitModule(java.lang.String name, int access, java.lang.String version)
ClassVisitorClassVisitor の visitModule name - モジュールの完全修飾名(ドットを使用)。access - ACC_OPEN、ACC_SYNTHETIC、ACC_MANDATED の中で、モジュールアクセスフラグ。version - モジュールのバージョン、または null。public void visitNestHost(java.lang.String nestHost)
ClassVisitorClassVisitor の visitNestHost nestHost - ネストのホストクラスの内部名。public final void visitOuterClass(java.lang.String owner,
java.lang.String name,
java.lang.String descriptor)ClassVisitorClassVisitor の visitOuterClass owner - クラスを囲むクラスの内部名。name - クラスを含むメソッドの名前、またはクラスがそのクラスのメソッドで囲まれていない場合は nulldescriptor - クラスを含むメソッドの記述子、またはクラスがその包含クラスのメソッドで囲まれていない場合は nullpublic final AnnotationVisitor visitAnnotation(java.lang.String descriptor, boolean visible)
ClassVisitorClassVisitor の visitAnnotation descriptor - アノテーションクラスのクラス記述子。visible - 実行時にアノテーションが表示される場合は true。public final AnnotationVisitor visitTypeAnnotation(int typeRef, TypePath typePath, java.lang.String descriptor, boolean visible)
ClassVisitorClassVisitor の 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)
ClassVisitorClassVisitor の visitAttribute attribute - 属性。public void visitNestMember(java.lang.String nestMember)
ClassVisitorClassVisitor の visitNestMember nestMember - ネストメンバーの内部名。public final void visitInnerClass(java.lang.String name,
java.lang.String outerName,
java.lang.String innerName,
int access)ClassVisitorClassVisitor の visitInnerClass name - 内部クラスの内部名(Type.getInternalName() を参照)outerName - 内部クラスが属するクラスの内部名(Type.getInternalName() を参照)メンバークラスではない場合は null になります。innerName - 包含クラス内の内部クラスの(単純な)名前匿名の内部クラスの場合は null になります。access - 外側のクラスで最初に宣言された内部クラスのアクセスフラグ。public final FieldVisitor visitField(int access, java.lang.String name, java.lang.String descriptor, java.lang.String signature, java.lang.Object value)
ClassVisitorClassVisitor の visitField access - フィールドのアクセスフラグ(Opcodes を参照)このパラメーターは、フィールドが合成か非推奨か、あるいはその両方かを示します。name - フィールドの名前。descriptor - フィールドの記述子(Type を参照)signature - フィールドの署名。フィールドの型がジェネリクス型を使用しない場合、null になることがあります。value - フィールドの初期値。このパラメーターは、フィールドに初期値がない場合は null になる可能性があり、Integer、Float、Long、Double、String (それぞれ、int、float、long または String フィールドの場合)である必要があります。 このパラメーターは、静的フィールドにのみ使用されます。その値は、コンストラクターまたはメソッドのバイトコード命令を介して初期化する必要がある非静的フィールドでは無視されます。public final MethodVisitor visitMethod(int access, java.lang.String name, java.lang.String descriptor, java.lang.String signature, java.lang.String[] exceptions)
ClassVisitorMethodVisitor インスタンス(または null)を返す必要があります。つまり、以前に返されたビジターを返しません。ClassVisitor の visitMethod access - メソッドのアクセスフラグ(Opcodes を参照)このパラメーターは、メソッドが合成であるか、非推奨であるかを示します。name - メソッドの名前。descriptor - メソッドの記述子(Type を参照)signature - メソッドの署名。メソッドのパラメーター、戻り値の型、例外がジェネリクス型を使用しない場合、null になることがあります。exceptions - メソッドの例外クラスの内部名(Type.getInternalName() を参照) null の可能性があります。public final void visitEnd()
ClassVisitorClassVisitor の visitEnd public byte[] toByteArray()
throws ClassTooLargeException,
MethodTooLargeExceptionClassTooLargeException - クラスの定数プールが大きすぎる場合。MethodTooLargeException - メソッドのコード属性が大きすぎる場合。public int newConst(java.lang.Object value)
Attribute サブクラスを対象としており、通常、クラスジェネレーターやアダプターでは必要ありません。value - 定数プールに追加される定数の値。このパラメーターは、Integer、Float、Long、Double、String である必要があります。public int newUTF8(java.lang.String value)
Attribute サブクラスを対象としており、通常、クラスジェネレーターやアダプターでは必要ありません。value - 文字列値。public int newClass(java.lang.String value)
Attribute サブクラスを対象としており、通常、クラスジェネレーターやアダプターでは必要ありません。value - クラスの内部名。public int newMethodType(java.lang.String methodDescriptor)
Attribute サブクラスを対象としており、通常、クラスジェネレーターやアダプターでは必要ありません。methodDescriptor - メソッド型のメソッド記述子。public int newModule(java.lang.String moduleName)
Attribute サブクラスを対象としており、通常、クラスジェネレーターやアダプターでは必要ありません。moduleName - モジュールの名前。public int newPackage(java.lang.String packageName)
Attribute サブクラスを対象としており、通常、クラスジェネレーターやアダプターでは必要ありません。packageName - 内部形式でのパッケージの名前。@Deprecated
public int newHandle(int tag,
java.lang.String owner,
java.lang.String name,
java.lang.String 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 - フィールドまたはメソッド所有者クラスの内部名。name - フィールドまたはメソッドの名前。descriptor - フィールドまたはメソッドの記述子。public int newHandle(int tag,
java.lang.String owner,
java.lang.String name,
java.lang.String 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 - フィールドまたはメソッド所有者クラスの内部名。name - フィールドまたはメソッドの名前。descriptor - フィールドまたはメソッドの記述子。isInterface - 所有者がインターフェースの場合は true。public int newConstantDynamic(java.lang.String name,
java.lang.String descriptor,
Handle bootstrapMethodHandle,
java.lang.Object... bootstrapMethodArguments)Attribute サブクラスを対象としており、通常、クラスジェネレーターやアダプターでは必要ありません。name - 呼び出されたメソッドの名前。descriptor - 定数型のフィールド記述子。bootstrapMethodHandle - ブートストラップメソッド。bootstrapMethodArguments - ブートストラップメソッド定数引数。public int newInvokeDynamic(java.lang.String name,
java.lang.String descriptor,
Handle bootstrapMethodHandle,
java.lang.Object... bootstrapMethodArguments)Attribute サブクラスを対象としており、通常、クラスジェネレーターやアダプターでは必要ありません。name - 呼び出されたメソッドの名前。descriptor - invoke メソッドの記述子。bootstrapMethodHandle - ブートストラップメソッド。bootstrapMethodArguments - ブートストラップメソッド定数引数。public int newField(java.lang.String owner,
java.lang.String name,
java.lang.String descriptor)Attribute サブクラスを対象としており、通常、クラスジェネレーターやアダプターでは必要ありません。owner - フィールドの所有者クラスの内部名。name - フィールドの名前。descriptor - フィールドの記述子。public int newMethod(java.lang.String owner,
java.lang.String name,
java.lang.String descriptor,
boolean isInterface)Attribute サブクラスを対象としており、通常、クラスジェネレーターやアダプターでは必要ありません。owner - メソッドの所有者クラスの内部名。name - メソッドの名前。descriptor - メソッドの記述子。isInterface - owner がインターフェースの場合は true。public int newNameType(java.lang.String name,
java.lang.String descriptor)Attribute サブクラスを対象としており、通常、クラスジェネレーターやアダプターでは必要ありません。name - 名前。descriptor - 型記述子。protected java.lang.String getCommonSuperClass(java.lang.String type1,
java.lang.String type2)type1 - クラスの内部名。type2 - 別のクラスの内部名。protected java.lang.ClassLoader getClassLoader()
getCommonSuperClass(String, String) のデフォルトの実装で使用される ClassLoader を返します。これは、この ClassWriter のランタイム型のデフォルトの実装です。