public abstract class MethodVisitor extends ObjectSE
visitParameter
)* [ visitAnnotationDefault
](visitAnnotation
| visitAnnotableParameterCount
| visitParameterAnnotation
visitTypeAnnotation
| visitAttribute
)* [ visitCode
(visitFrame
| visit<i>X</i>Insn
| visitLabel
| visitInsnAnnotation
| visitTryCatchBlock
| visitTryCatchAnnotation
| visitLocalVariable
| visitLocalVariableAnnotation
| visitLineNumber
)* visitMaxs
] visitEnd
。さらに、visit<i>X</i>Insn
および visitLabel
メソッドは、訪問先コードのバイトコード命令の順序で呼び出す必要があります。visitInsnAnnotation
は 、アノテーション付き命令の後に呼び出す必要があります。visitTryCatchBlock
は、引数として渡されるラベルが訪問される前に呼び出す必要があります。visitTryCatchBlockAnnotation
は、対応の try catch ブロックの後に呼ばれるが訪問してきた、との引数として渡されたラベルが訪問された後 visitLocalVariable
、visitLocalVariableAnnotation
、visitLineNumber
メソッドを呼び出す必要があります。修飾子と型 | フィールドと説明 |
---|---|
protected int | api このビジターによって実装された ASM API バージョン。 |
protected MethodVisitor | mv このビジターがメソッド呼び出しを委譲する必要があるメソッドビジター。 |
コンストラクターと説明 |
---|
MethodVisitor(int api) 新しい MethodVisitor を構築します。 |
MethodVisitor(int api, MethodVisitor methodVisitor) 新しい MethodVisitor を構築します。 |
修飾子と型 | メソッドと説明 |
---|---|
void | visitAnnotableParameterCount(int parameterCount, boolean visible) アノテーションを付けることができるメソッドパラメーターの数にアクセスします。 |
AnnotationVisitor | visitAnnotation(StringSE descriptor, boolean visible) このメソッドのアノテーションにアクセスします。 |
AnnotationVisitor | visitAnnotationDefault() このアノテーションインターフェースメソッドのデフォルト値にアクセスします。 |
void | visitAttribute(Attribute attribute) このメソッドの非標準属性を訪問します。 |
void | visitCode() メソッドのコードの訪問を開始します(ある場合)。 |
void | visitEnd() メソッドの最後にアクセスします。 |
void | visitFieldInsn(int opcode, StringSE owner, StringSE name, StringSE descriptor) 現場指示を訪問します。 |
void | visitFrame(int type, int numLocal, ObjectSE[] local, int numStack, ObjectSE[] stack) ローカル変数とオペランドスタック要素の現在の状態にアクセスします。 |
void | visitIincInsn(int var, int increment) IINC 命令を訪問します。 |
void | visitInsn(int opcode) ゼロオペランド命令にアクセスします。 |
AnnotationVisitor | visitInsnAnnotation(int typeRef, TypePath typePath, StringSE descriptor, boolean visible) 指示のアノテーションにアクセスします。 |
void | visitIntInsn(int opcode, int operand) 単一の int オペランドを持つ命令を訪問します。 |
void | visitInvokeDynamicInsn(StringSE name, StringSE descriptor, Handle bootstrapMethodHandle, ObjectSE... bootstrapMethodArguments) invokedynamic 命令にアクセスします。 |
void | visitJumpInsn(int opcode, Label label) ジャンプ命令を訪問します。 |
void | visitLabel(Label label) ラベルにアクセスします。 |
void | visitLdcInsn(ObjectSE value) LDC 命令を訪問します。 |
void | visitLineNumber(int line, Label start) 行番号宣言にアクセスします。 |
void | visitLocalVariable(StringSE name, StringSE descriptor, StringSE signature, Label start, Label end, int index) ローカル変数宣言にアクセスします。 |
AnnotationVisitor | visitLocalVariableAnnotation(int typeRef, TypePath typePath, Label[] start, Label[] end, int[] index, StringSE descriptor, boolean visible) ローカル変数型のアノテーションにアクセスします。 |
void | visitLookupSwitchInsn(Label dflt, int[] keys, Label[] labels) LOOKUPSWITCH 命令を訪問します。 |
void | visitMaxs(int maxStack, int maxLocals) メソッドの最大スタックサイズとローカル変数の最大数にアクセスします。 |
void | visitMethodInsn(int opcode, StringSE owner, StringSE name, StringSE descriptor) 使用すべきではありません。 代わりに visitMethodInsn(int, String, String, String, boolean) を使用してください。 |
void | visitMethodInsn(int opcode, StringSE owner, StringSE name, StringSE descriptor, boolean isInterface) メソッドの説明にアクセスします。 |
void | visitMultiANewArrayInsn(StringSE descriptor, int numDimensions) MULTIANEWARRAY 命令を訪問します。 |
void | visitParameter(StringSE name, int access) このメソッドのパラメーターを訪問します。 |
AnnotationVisitor | visitParameterAnnotation(int parameter, StringSE descriptor, boolean visible) このメソッドのパラメーターのアノテーションにアクセスします。 |
void | visitTableSwitchInsn(int min, int max, Label dflt, Label... labels) TABLESWITCH 命令を訪問します。 |
AnnotationVisitor | visitTryCatchAnnotation(int typeRef, TypePath typePath, StringSE descriptor, boolean visible) 例外ハンドラー型のアノテーションにアクセスします。 |
void | visitTryCatchBlock(Label start, Label end, Label handler, StringSE type) try catch ブロックにアクセスします。 |
AnnotationVisitor | visitTypeAnnotation(int typeRef, TypePath typePath, StringSE descriptor, boolean visible) メソッドシグネチャーの型のアノテーションにアクセスします。 |
void | visitTypeInsn(int opcode, StringSE type) 型命令を訪問します。 |
void | visitVarInsn(int opcode, int var) ローカル変数命令を訪問します。 |
cloneSE, equalsSE, finalizeSE, getClassSE, hashCodeSE, notifySE, notifyAllSE, toStringSE, waitSE, waitSE, waitSE
protected final int api
Opcodes.ASM4
、Opcodes.ASM5
、Opcodes.ASM6
、Opcodes.ASM7
のいずれかである必要があります。protected MethodVisitor mv
public MethodVisitor(int api)
MethodVisitor
を構築します。api
- このビジターが実装した ASM API バージョン。Opcodes.ASM4
、Opcodes.ASM5
、Opcodes.ASM6
、Opcodes.ASM7
のいずれかである必要があります。public MethodVisitor(int api, MethodVisitor methodVisitor)
MethodVisitor
を構築します。api
- このビジターが実装した ASM API バージョン。Opcodes.ASM4
、Opcodes.ASM5
、Opcodes.ASM6
、Opcodes.ASM7
のいずれかである必要があります。methodVisitor
- このビジターがメソッド呼び出しを委譲する必要があるメソッドビジター。null の可能性があります。public void visitParameter(StringSE name, int access)
name
- パラメーター名。指定されていない場合は null。access
- パラメーターのアクセスフラグ、ACC_FINAL
、ACC_SYNTHETIC
、/ および ACC_MANDATED
のみが許可されます(Opcodes
を参照)。public AnnotationVisitor visitAnnotationDefault()
public AnnotationVisitor visitAnnotation(StringSE descriptor, boolean visible)
descriptor
- アノテーションクラスのクラス記述子。visible
- 実行時にアノテーションが表示される場合は true。public AnnotationVisitor visitTypeAnnotation(int typeRef, TypePath typePath, StringSE descriptor, boolean visible)
typeRef
- アノテーション付き型への参照。この型の参照の種類は、TypeReference.METHOD_TYPE_PARAMETER
、TypeReference.METHOD_TYPE_PARAMETER_BOUND
、TypeReference.METHOD_RETURN
、TypeReference.METHOD_RECEIVER
、TypeReference.METHOD_FORMAL_PARAMETER
、TypeReference.THROWS
である必要があります。TypeReference
を参照してください。typePath
- 'typeRef' 内のアノテーション付き型引数、ワイルドカード境界、配列要素型、静的内部型へのパス。アノテーションが 'typeRef' 全体を対象とする場合は null になることがあります。descriptor
- アノテーションクラスのクラス記述子。visible
- 実行時にアノテーションが表示される場合は true。public void visitAnnotableParameterCount(int parameterCount, boolean visible)
parameterCount
- アノテーションを持つことができるメソッドパラメーターの数。この数は、メソッド記述子のパラメーター型の数以下である必要があります。メソッドに合成パラメーターがあり、パラメーターアノテーションの目的でパラメーターインデックスを計算するときにこれらのパラメーターが無視される場合は、厳密に少なくなる可能性があります(https://docs.oracle.com/javase/specs/jvms/se9/html/jvms-4.html#jvms-4.7.18) を参照)。visible
- 実行時にアノテーションを表示できるメソッドパラメーターの数を定義する場合は true、実行時にアノテーションを非表示にすることができるメソッドパラメーターの数を定義する場合は false。public AnnotationVisitor visitParameterAnnotation(int parameter, StringSE descriptor, boolean visible)
parameter
- パラメーターインデックス。このインデックスは、メソッド記述子のパラメーターの数よりも厳密に小さく、visitAnnotableParameterCount(int, boolean)
で指定されたパラメーターの数よりも厳密に小さくする必要があります。重要な注意: 特に合成パラメーターの場合、パラメーターインデックス i は、メソッド記述子の i 番目のパラメーター記述子に対応する必要はありません(https://docs.oracle.com/javase/specs/jvms/se9/html/jvms-4.html#jvms-4.7.18) を参照)。descriptor
- アノテーションクラスのクラス記述子。visible
- 実行時にアノテーションが表示される場合は true。public void visitAttribute(Attribute attribute)
attribute
- 属性。public void visitCode()
public void visitFrame(int type, int numLocal, ObjectSE[] local, int numStack, ObjectSE[] stack)
Opcodes.V1_6
以上のクラスにのみ必須です。Opcodes.F_SAME
は、前のフレームとまったく同じローカルで、スタックが空のフレームを表します。Opcodes.F_SAME1
は、前のフレームとまったく同じローカルで、スタック上の単一の値を持つフレームを表します(numStack
は 1 で、stack[0]
にはスタックアイテムの型の値が含まれます)。Opcodes.F_APPEND
は、追加のローカルが定義されていることを除いて、前のフレームのローカルと同じです( numLocal
は 1, 2 または 3 であり、local
要素には追加された型を表す値が含まれます)。Opcodes.F_CHOP
は、最後の 1 〜 3 のローカルが存在せず、スタックが空であることを除いて、前のフレームのローカルと同じです(numLocal
は 1, 2 または 3 です)。Opcodes.F_FULL
。type
- このスタックマップフレームの型。拡張フレームの場合は Opcodes.F_NEW
、圧縮フレームの場合は Opcodes.F_FULL
、Opcodes.F_APPEND
、Opcodes.F_CHOP
、Opcodes.F_SAME
または Opcodes.F_APPEND
、Opcodes.F_SAME1
である必要があります。numLocal
- 訪問したフレーム内のローカル変数の数。local
- このフレームのローカル変数型。この配列は変更しないでください。プリミティブ型は、Opcodes.TOP
、Opcodes.INTEGER
、Opcodes.FLOAT
、Opcodes.LONG
、Opcodes.DOUBLE
、Opcodes.NULL
、Opcodes.UNINITIALIZED_THIS
で表されます(long と double は単一の要素で表されます)。参照型は String オブジェクト(内部名を表す)で表され、初期化されていない型は Label オブジェクトで表されます(このラベルは、この初期化されていない値を作成した NEW 命令を示します)。numStack
- 訪問したフレームのオペランドスタック要素の数。stack
- このフレームのオペランドスタック型。この配列は変更しないでください。その内容は「ローカル」配列と同じ形式です。IllegalStateExceptionSE
- フレームが次のフレームの直後にアクセスされ、2 つの間に命令がない場合(このフレームが Opcodes#F_SAME フレームである場合を除き、この場合は確認なしで無視されます)。public void visitInsn(int opcode)
opcode
- the opcode of the instruction to be visited. This opcode is either NOP, ACONST_NULL, ICONST_M1, ICONST_0, ICONST_1, ICONST_2, ICONST_3, ICONST_4, ICONST_5, LCONST_0, LCONST_1, FCONST_0, FCONST_1, FCONST_2, DCONST_0, DCONST_1, IALOAD, LALOAD, FALOAD, DALOAD, AALOAD, BALOAD, CALOAD, SALOAD, IASTORE, LASTORE, FASTORE, DASTORE, AASTORE, BASTORE, CASTORE, SASTORE, POP, POP2, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1, DUP2_X2, SWAP, IADD, LADD, FADD, DADD, ISUB, LSUB, FSUB, DSUB, IMUL, LMUL, FMUL, DMUL, IDIV, LDIV, FDIV, DDIV, IREM, LREM, FREM, DREM, INEG, LNEG, FNEG, DNEG, ISHL, LSHL, ISHR, LSHR, IUSHR, LUSHR, IAND, LAND, IOR, LOR, IXOR, LXOR, I2L, I2F, I2D, L2I, L2F, L2D, F2I, F2L, F2D, D2I, D2L, D2F, I2B, I2C, I2S, LCMP, FCMPL, FCMPG, DCMPL, DCMPG, IRETURN, LRETURN, FRETURN, DRETURN, ARETURN, RETURN, ARRAYLENGTH, ATHROW, MONITORENTER, or MONITOREXIT.public void visitIntInsn(int opcode, int operand)
opcode
- 訪問する命令のオペコード。このオペコードは、BIPUSH、SIPUSH、NEWARRAY のいずれかです。operand
- 訪問する命令のオペランド。Opcodes.T_BOOLEAN
、Opcodes.T_CHAR
、Opcodes.T_FLOAT
、Opcodes.T_DOUBLE
、Opcodes.T_BYTE
、Opcodes.T_SHORT
、Opcodes.T_INT
、Opcodes.T_LONG
のいずれかである必要があります。public void visitVarInsn(int opcode, int var)
opcode
- 訪問するローカル変数命令のオペコード。このオペコードは、ILOAD、LLOAD、FLOAD、DLOAD、ALOAD、ISTORE、LSTORE、FSTORE、DSTORE、ASTORE、RET のいずれかです。var
- 訪問する命令のオペランド。このオペランドは、ローカル変数のインデックスです。public void visitTypeInsn(int opcode, StringSE type)
opcode
- 訪問する型命令のオペコード。このオペコードは、NEW、ANEWARRAY、CHECKCAST、INSTANCEOF のいずれかです。type
- 訪問する命令のオペランド。このオペランドは、オブジェクトまたは配列クラスの内部名である必要があります(Type.getInternalName()
を参照)。public void visitFieldInsn(int opcode, StringSE owner, StringSE name, StringSE descriptor)
opcode
- 訪問する型命令のオペコード。このオペコードは、GETSTATIC、PUTSTATIC、GETFIELD、PUTFIELD のいずれかです。owner
- フィールドの所有者クラスの内部名(Type.getInternalName()
を参照)。name
- フィールドの名前。descriptor
- フィールドの記述子(Type
を参照)@DeprecatedSE public void visitMethodInsn(int opcode, StringSE owner, StringSE name, StringSE descriptor)
visitMethodInsn(int, String, String, String, boolean)
を使用してください。opcode
- 訪問する型命令のオペコード。このオペコードは、INVOKEVIRTUAL、INVOKESPECIAL、INVOKESTATIC、INVOKEINTERFACE のいずれかです。owner
- メソッドの所有者クラスの内部名(Type.getInternalName()
を参照)。name
- メソッドの名前。descriptor
- メソッドの記述子(Type
を参照)public void visitMethodInsn(int opcode, StringSE owner, StringSE name, StringSE descriptor, boolean isInterface)
opcode
- 訪問する型命令のオペコード。このオペコードは、INVOKEVIRTUAL、INVOKESPECIAL、INVOKESTATIC、INVOKEINTERFACE のいずれかです。owner
- メソッドの所有者クラスの内部名(Type.getInternalName()
を参照)。name
- メソッドの名前。descriptor
- メソッドの記述子(Type
を参照)isInterface
- メソッドの所有者クラスがインターフェースの場合。public void visitInvokeDynamicInsn(StringSE name, StringSE descriptor, Handle bootstrapMethodHandle, ObjectSE... bootstrapMethodArguments)
public void visitJumpInsn(int opcode, Label label)
opcode
- 訪問する型命令のオペコード。このオペコードは、IFEQ、IFNE、IFLT、IFGE、IFGT、IFLE、IF_ICMPEQ、IF_ICMPNE、IF_ICMPLT、IF_ICMPGE、IF_ICMPGT、IF_ICMPLE、IF_ACMPEQ、IF_ACMPNE、GOTO、JSR、IFNULL、IFNONNULL のいずれかです。label
- 訪問する命令のオペランド。このオペランドは、ジャンプ命令がジャンプできる命令を指定するラベルです。public void visitLabel(Label label)
label
- Label
オブジェクト。public void visitLdcInsn(ObjectSE value)
if (cst instanceof Integer) { // ... } else if (cst instanceof Float) { // ... } else if (cst instanceof Long) { // ... } else if (cst instanceof Double) { // ... } else if (cst instanceof String) { // ... } else if (cst instanceof Type) { int sort = ((Type) cst).getSort(); if (sort == Type.OBJECT) { // ... } else if (sort == Type.ARRAY) { // ... } else if (sort == Type.METHOD) { // ... } else { // throw an exception } } else if (cst instanceof Handle) { // ... } else if (cst instanceof ConstantDynamic) { // ... } else { // throw an exception }
public void visitIincInsn(int var, int increment)
var
- インクリメントするローカル変数のインデックス。increment
- ローカル変数をインクリメントする量。public void visitTableSwitchInsn(int min, int max, Label dflt, Label... labels)
min
- キーの最小値。max
- キーの最大値。dflt
- デフォルトのハンドラーブロックの始まり。labels
- ハンドラーブロックの始まり。labels[i]
は、min + i
キーのハンドラーブロックの先頭です。public void visitLookupSwitchInsn(Label dflt, int[] keys, Label[] labels)
dflt
- デフォルトのハンドラーブロックの始まり。keys
- キーの値。labels
- ハンドラーブロックの始まり。labels[i]
は、keys[i]
キーのハンドラーブロックの先頭です。public void visitMultiANewArrayInsn(StringSE descriptor, int numDimensions)
descriptor
- 配列型記述子(Type
を参照)。numDimensions
- 割り当てる配列の次元数。public AnnotationVisitor visitInsnAnnotation(int typeRef, TypePath typePath, StringSE descriptor, boolean visible)
typeRef
- アノテーション付き型への参照。この型参照のソートは、TypeReference.INSTANCEOF
、TypeReference.NEW
、TypeReference.CONSTRUCTOR_REFERENCE
、TypeReference.METHOD_REFERENCE
、TypeReference.CAST
、TypeReference.CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT
、TypeReference.METHOD_INVOCATION_TYPE_ARGUMENT
、TypeReference.CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT
、TypeReference.METHOD_REFERENCE_TYPE_ARGUMENT
である必要があります。TypeReference
を参照してください。typePath
- 'typeRef' 内のアノテーション付き型引数、ワイルドカード境界、配列要素型、静的内部型へのパス。アノテーションが 'typeRef' 全体を対象とする場合は null になることがあります。descriptor
- アノテーションクラスのクラス記述子。visible
- 実行時にアノテーションが表示される場合は true。public void visitTryCatchBlock(Label start, Label end, Label handler, StringSE type)
start
- 例外ハンドラーのスコープの先頭(両端を含む)。end
- 例外ハンドラーのスコープの終わり(排他的)。handler
- 例外ハンドラーのコードの先頭。type
- ハンドラーによって処理される例外の型の内部名、または例外をキャッチする場合は null( "finally" ブロックの場合)。IllegalArgumentExceptionSE
- ラベルの 1 つがこの訪問者によってすでに訪問されている場合(visitLabel(org.springframework.asm.Label)
メソッドによる)。public AnnotationVisitor visitTryCatchAnnotation(int typeRef, TypePath typePath, StringSE descriptor, boolean visible)
visitTryCatchBlock(org.springframework.asm.Label, org.springframework.asm.Label, org.springframework.asm.Label, java.lang.String)
の後に呼び出す必要があります。同じ例外ハンドラーに対して複数回呼び出すことができます。typeRef
- アノテーション付きの型への参照。この型参照の種類は TypeReference.EXCEPTION_PARAMETER
でなければなりません。TypeReference
を参照してください。typePath
- 'typeRef' 内のアノテーション付き型引数、ワイルドカード境界、配列要素型、静的内部型へのパス。アノテーションが 'typeRef' 全体を対象とする場合は null になることがあります。descriptor
- アノテーションクラスのクラス記述子。visible
- 実行時にアノテーションが表示される場合は true。public void visitLocalVariable(StringSE name, StringSE descriptor, StringSE signature, Label start, Label end, int index)
name
- ローカル変数の名前。descriptor
- このローカル変数の型記述子。signature
- このローカル変数の型シグネチャー。ローカル変数型がジェネリクス型を使用しない場合は null になる可能性があります。start
- このローカル変数のスコープに対応する最初の命令(両端を含む)。end
- このローカル変数のスコープに対応する最後の命令(排他的)。index
- ローカル変数のインデックス。IllegalArgumentExceptionSE
- ラベルの 1 つがこの訪問者によってまだ訪問されていない場合(visitLabel(org.springframework.asm.Label)
メソッドによる)。public AnnotationVisitor visitLocalVariableAnnotation(int typeRef, TypePath typePath, Label[] start, Label[] end, int[] index, StringSE descriptor, boolean visible)
typeRef
- アノテーション付き型への参照。この型参照の種類は、TypeReference.LOCAL_VARIABLE
または TypeReference.RESOURCE_VARIABLE
である必要があります。TypeReference
を参照してください。typePath
- 'typeRef' 内のアノテーション付き型引数、ワイルドカード境界、配列要素型、静的内部型へのパス。アノテーションが 'typeRef' 全体を対象とする場合は null になることがあります。start
- このローカル変数のスコープを構成する連続範囲に対応する最初の命令(両端を含む)。end
- このローカル変数のスコープを作成する連続範囲に対応する最後の命令(排他的)。この配列は、「開始」配列と同じサイズである必要があります。index
- 各範囲のローカル変数のインデックス。この配列は、「開始」配列と同じサイズである必要があります。descriptor
- アノテーションクラスのクラス記述子。visible
- 実行時にアノテーションが表示される場合は true。public void visitLineNumber(int line, Label start)
line
- 行番号。この番号は、クラスがコンパイルされたソースファイルを参照します。start
- この行番号に対応する最初の命令。IllegalArgumentExceptionSE
- start
がこの訪問者によってまだ訪問されていない場合 (visitLabel(org.springframework.asm.Label)
メソッドによる)。public void visitMaxs(int maxStack, int maxLocals)
maxStack
- メソッドの最大スタックサイズ。maxLocals
- メソッドのローカル変数の最大数。public void visitEnd()