public class ClassWriter extends ClassVisitor
ClassVisitor
。より正確には、このビジターは Java クラスファイル形式に準拠したバイト配列を生成します。単独で使用して「ゼロから」Java クラスを生成するか、1 つ以上の ClassReader
およびアダプタークラスビジターとともに使用して、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() |
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 cst) ビルドされるクラスの定数プールに数値または文字列定数を追加します。 |
int | newField(java.lang.String owner, java.lang.String name, java.lang.String desc) ビルドされるクラスの定数プールにフィールド参照を追加します。 |
int | newHandle(int tag, java.lang.String owner, java.lang.String name, java.lang.String desc) 使用すべきではありません。 このメソッドは newHandle(int, String, String, String, boolean) に取って代わりました。 |
int | newHandle(int tag, java.lang.String owner, java.lang.String name, java.lang.String desc, boolean itf) ビルドされるクラスの定数プールにハンドルを追加します。 |
int | newInvokeDynamic(java.lang.String name, java.lang.String desc, Handle bsm, java.lang.Object... bsmArgs) ビルドされるクラスの定数プールに invokedynamic 参照を追加します。 |
int | newMethod(java.lang.String owner, java.lang.String name, java.lang.String desc, boolean itf) ビルドされるクラスの定数プールにメソッド参照を追加します。 |
int | newMethodType(java.lang.String methodDesc) ビルドされるクラスの定数プールにメソッド型参照を追加します。 |
int | newNameType(java.lang.String name, java.lang.String desc) ビルドするクラスの定数プールに名前と型を追加します。 |
int | newUTF8(java.lang.String value) ビルドされるクラスの定数プールに UTF8 文字列を追加します。 |
byte[] | toByteArray() このクラスライターで作成されたクラスのバイトコードを返します。 |
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 desc, boolean visible) クラスのアノテーションにアクセスします。 |
void | visitAttribute(Attribute attr) クラスの非標準属性を訪問します。 |
void | visitEnd() クラスの最後を訪問します。 |
FieldVisitor | visitField(int access, java.lang.String name, java.lang.String desc, 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 desc, java.lang.String signature, java.lang.String[] exceptions) クラスのメソッドを訪問します。 |
void | visitOuterClass(java.lang.String owner, java.lang.String name, java.lang.String desc) クラスの外側のクラスを訪問します。 |
void | visitSource(java.lang.String file, java.lang.String debug) クラスのソースを訪問します。 |
AnnotationVisitor | visitTypeAnnotation(int typeRef, TypePath typePath, java.lang.String desc, boolean visible) クラスシグネチャーの型のアノテーションにアクセスします。 |
public static final int COMPUTE_MAXS
visitMethod
メソッドによって返される MethodVisitor
の visitMaxs
メソッドの引数は無視され、各メソッドの署名とバイトコードから自動的に計算されます。ClassWriter(int)
, 定数フィールド値 public static final int COMPUTE_FRAMES
MethodVisitor.visitFrame(int, int, java.lang.Object[], int, java.lang.Object[])
メソッドの呼び出しは無視され、スタックマップフレームはメソッドのバイトコードから再計算されます。visitMaxs
メソッドの引数も無視され、バイトコードから再計算されます。つまり、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)
ClassVisitor
ClassVisitor
の visit
version
- クラスのバージョン。access
- クラスのアクセスフラグ(Opcodes
を参照)このパラメーターは、クラスが非推奨かどうかも示します。name
- クラスの内部名(getInternalName
を参照)signature
- このクラスの署名。クラスが総称クラスではなく、総称クラスまたはインターフェースを継承または実装しない場合は、 null になる可能性があります。superName
- スーパークラスの内部名(getInternalName
を参照)インターフェースの場合、スーパークラスは Object
です。 null の場合がありますが、Object
クラスの場合のみです。interfaces
- クラスのインターフェースの内部名(getInternalName
を参照) null の場合があります。public final void visitSource(java.lang.String file, java.lang.String debug)
ClassVisitor
ClassVisitor
の visitSource
file
- クラスのコンパイル元のソースファイルの名前。 null の場合があります。debug
- クラスのソース要素とコンパイル済み要素の間の対応を計算するための追加のデバッグ情報。 null の場合があります。public final void visitOuterClass(java.lang.String owner, java.lang.String name, java.lang.String desc)
ClassVisitor
ClassVisitor
の visitOuterClass
owner
- クラスを囲むクラスの内部名。name
- クラスを含むメソッドの名前、またはクラスがそのクラスのメソッドで囲まれていない場合は null 。desc
- クラスを含むメソッドの記述子、またはクラスがその包含クラスのメソッドで囲まれていない場合は null 。public final AnnotationVisitor visitAnnotation(java.lang.String desc, boolean visible)
ClassVisitor
ClassVisitor
の visitAnnotation
desc
- アノテーションクラスのクラス記述子。visible
- true アノテーションが実行時に表示される場合。public final AnnotationVisitor visitTypeAnnotation(int typeRef, TypePath typePath, java.lang.String desc, boolean visible)
ClassVisitor
ClassVisitor
の visitTypeAnnotation
typeRef
- アノテーション付きの型への参照。この型参照の種類は、CLASS_TYPE_PARAMETER
、CLASS_TYPE_PARAMETER_BOUND
または CLASS_EXTENDS
でなければなりません。TypeReference
を参照してください。typePath
- 'typeRef' 内のアノテーション付き型引数、ワイルドカード境界、配列要素型、静的内部型へのパス。アノテーションが 'typeRef' 全体を対象とする場合は、null になることがあります。desc
- アノテーションクラスのクラス記述子。visible
- true アノテーションが実行時に表示される場合。public final void visitAttribute(Attribute attr)
ClassVisitor
ClassVisitor
の visitAttribute
attr
- 属性。public final void visitInnerClass(java.lang.String name, java.lang.String outerName, java.lang.String innerName, int access)
ClassVisitor
ClassVisitor
の visitInnerClass
name
- 内部クラスの内部名(getInternalName
を参照)outerName
- 内部クラスが属するクラスの内部名(getInternalName
を参照)メンバークラスではない場合は、 null になることがあります。innerName
- 包含クラス内の内部クラスの(単純な)名前匿名の内部クラスの場合、 null になる場合があります。access
- 外側のクラスで最初に宣言された内部クラスのアクセスフラグ。public final FieldVisitor visitField(int access, java.lang.String name, java.lang.String desc, java.lang.String signature, java.lang.Object value)
ClassVisitor
ClassVisitor
の visitField
access
- フィールドのアクセスフラグ(Opcodes
を参照)このパラメーターは、フィールドが合成か非推奨か、あるいはその両方かを示します。name
- フィールドの名前。desc
- フィールドの記述子(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 desc, java.lang.String signature, java.lang.String[] exceptions)
ClassVisitor
MethodVisitor
インスタンス(または null)を返す必要があります。つまり、以前に返されたビジターを返しません。ClassVisitor
の visitMethod
access
- メソッドのアクセスフラグ(Opcodes
を参照)このパラメーターは、メソッドが合成であるか、非推奨であるかを示します。name
- メソッドの名前。desc
- メソッドの記述子(Type
を参照)signature
- メソッドの署名。メソッドのパラメーター、戻り値の型、例外がジェネリクス型を使用しない場合、 null になることがあります。exceptions
- メソッドの例外クラスの内部名(getInternalName
を参照) null の場合があります。public final void visitEnd()
ClassVisitor
ClassVisitor
の visitEnd
public byte[] toByteArray()
public int newConst(java.lang.Object cst)
Attribute
サブクラスを対象としており、通常、クラスジェネレーターやアダプターでは必要ありません。cst
- 定数プールに追加される定数の値。このパラメーターは、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 methodDesc)
Attribute
サブクラスを対象としており、通常、クラスジェネレーターやアダプターでは必要ありません。methodDesc
- メソッド型のメソッド記述子。@Deprecated public int newHandle(int tag, java.lang.String owner, java.lang.String name, java.lang.String desc)
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
- フィールドまたはメソッドの名前。desc
- フィールドまたはメソッドの記述子。public int newHandle(int tag, java.lang.String owner, java.lang.String name, java.lang.String desc, boolean itf)
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
- フィールドまたはメソッドの名前。desc
- フィールドまたはメソッドの記述子。itf
- 所有者がインターフェースの場合は true。public int newInvokeDynamic(java.lang.String name, java.lang.String desc, Handle bsm, java.lang.Object... bsmArgs)
Attribute
サブクラスを対象としており、通常、クラスジェネレーターやアダプターでは必要ありません。name
- 呼び出されたメソッドの名前。desc
- invoke メソッドの記述子。bsm
- ブートストラップメソッド。bsmArgs
- ブートストラップメソッド定数引数。public int newField(java.lang.String owner, java.lang.String name, java.lang.String desc)
Attribute
サブクラスを対象としており、通常、クラスジェネレーターやアダプターでは必要ありません。owner
- フィールドの所有者クラスの内部名。name
- フィールドの名前。desc
- フィールドの記述子。public int newMethod(java.lang.String owner, java.lang.String name, java.lang.String desc, boolean itf)
Attribute
サブクラスを対象としており、通常、クラスジェネレーターやアダプターでは必要ありません。owner
- メソッドの所有者クラスの内部名。name
- メソッドの名前。desc
- メソッドの記述子。itf
- 所有者がインターフェースの場合は true 。public int newNameType(java.lang.String name, java.lang.String desc)
Attribute
サブクラスを対象としており、通常、クラスジェネレーターやアダプターでは必要ありません。name
- 名前。desc
- 型記述子。protected java.lang.String getCommonSuperClass(java.lang.String type1, java.lang.String type2)
type1
- クラスの内部名。type2
- 別のクラスの内部名。protected java.lang.ClassLoader getClassLoader()