MethodVisitor that checks that its methods are properly used. More precisely this
method adapter checks each instruction individually, i.e., each visit method checks some
preconditions based only on its arguments - such as the fact that the given opcode is
correct for a given visit method. This adapter can also perform some basic data flow checks (more
precisely those that can be performed without the full class hierarchy - see org.objectweb.asm.tree.analysis.BasicVerifier ). For instance in a method whose signature is
void m (), the invalid instruction IRETURN, or the invalid sequence IADD L2I will be
detected if the data flow checks are enabled. These checks are enabled by using the CheckMethodAdapter(int, String, String, MethodVisitor, Map) constructor. They are not performed if
any other constructor is used.
| Modifier and Type | Class and Description |
|---|---|
| private static enum | CheckMethodAdapter.
The 'generic' instruction visit methods (i.e. those that take an opcode argument). |
| pack-priv static class |
| Modifier and Type | Field and Description |
|---|---|
| private int | access
The access flags of the visited method. |
| private static final String | |
| private List | handlers
The exception handler ranges. |
| private int | insnCount
The number of visited instructions so far. |
| private static final String | |
| private static final String | |
| private static final String | |
| private static final String | |
| private int | invisibleAnnotableParameterCount
The number of method parameters that can have runtime invisible annotations. |
| private final Map | labelInsnIndices
The index of the instruction designated by each visited label. |
| private int | lastFrameInsnIndex
The index of the instruction corresponding to the last visited stack map frame. |
| private static final String | |
| private int | numCompressedFrames
The number of visited frames in compressed form. |
| private int | numExpandedFrames
The number of visited frames in expanded form. |
| private static final CheckMethodAdapter. | OPCODE_METHODS
The method to use to visit each instruction. |
| private Set | referencedLabels
The labels referenced by the visited method. |
| private static final String | |
| public int | version
The class version number. |
| private int | visibleAnnotableParameterCount
The number of method parameters that can have runtime visible annotations. |
| private boolean | visitCodeCalled
Whether the |
| private boolean | visitEndCalled
Whether the |
| private boolean | visitMaxCalled
Whether the |
| Access | Constructor and Description |
|---|---|
| public | CheckMethodAdapter(final MethodVisitor
the method visitor to which this adapter must delegate calls. methodvisitor)Constructs a new |
| public | CheckMethodAdapter(final MethodVisitor
the method visitor to which this adapter must delegate calls. methodVisitor, final Map<Label, Integer> the index of the instruction designated by each visited label so far
(in other methods). This map is updated with the labels from the visited method. labelInsnIndices)Constructs a new |
| protected | CheckMethodAdapter(final int
the ASM API version implemented by this CheckMethodAdapter. Must be one of the
api, final MethodVisitor ASMx values in Opcodes.the method visitor to which this adapter must delegate calls. methodVisitor, final Map<Label, Integer> the index of the instruction designated by each visited label so far
(in other methods). This map is updated with the labels from the visited method. labelInsnIndices)Constructs a new |
| public | CheckMethodAdapter(final int
the method's access flags. access, final String the method's name. name, final String the method's descriptor (see descriptor, final MethodVisitor Type).the method visitor to which this adapter must delegate calls. methodVisitor, final Map<Label, Integer> the index of the instruction designated by each visited label so far
(in other methods). This map is updated with the labels from the visited method. labelInsnIndices)Constructs a new |
| protected | CheckMethodAdapter(final int
the ASM API version implemented by this CheckMethodAdapter. Must be one of the
api, final int ASMx values in Opcodes.the method's access flags. access, final String the method's name. name, final String the method's descriptor (see descriptor, final MethodVisitor Type).the method visitor to which this adapter must delegate calls. methodVisitor, final Map<Label, Integer> the index of the instruction designated by each visited label so far
(in other methods). This map is updated with the labels from the visited method. labelInsnIndices)Constructs a new |
| Modifier and Type | Method and Description |
|---|---|
| pack-priv static void | |
| pack-priv static void | checkDescriptor(final int
the class version. version, final String the string to be checked. descriptor, final boolean true if canBeVoid)V can be considered valid.Checks that the given string is a valid type descriptor. |
| private static int | Returns: the index of the last character of the type descriptor, plus one.the class version. version, final String the string to be checked. descriptor, final int the index of the first character of the type descriptor (inclusive). startPos, final boolean whether canBeVoid)V can be considered valid.Checks that the given substring is a valid type descriptor. |
| private void | |
| pack-priv static void | checkIdentifier(final int
the class version. version, final String the string to be checked. name, final int the index of the first character of the identifier (inclusive). startPos, final int the index of the last character of the identifier (exclusive). -1 is equivalent
to endPos, final String name.length() if name is not null.the message to use in case of error. message)Checks that the given substring is a valid Java identifier. |
| private static void | checkInternalClassName(final int
the class version. version, final String the string to be checked. name, final String the message to use in case of error. message)Checks that the given string is a valid internal class name. |
| pack-priv static void | checkInternalName(final int
the class version. version, final String the string to be checked. name, final String the message to use in case of error. message)Checks that the given string is a valid internal class name or array type descriptor. |
| private void | checkLabel(final Label
the label to be checked. label, final boolean whether to check that the label has been visited. checkVisited, final String the message to use in case of error. message)Checks that the given label is not null. |
| private void | checkLdcConstant(final Object
the value to be checked. value)Checks that the given value is a valid operand for the LDC instruction. |
| pack-priv static void | checkMethodDescriptor(final int
the class version. version, final String the string to be checked. descriptor)Checks that the given string is a valid method descriptor. |
| pack-priv static void | checkMethodIdentifier(final int
the class version. version, final String the string to be checked. name, final String the message to use in case of error. message)Checks that the given string is a valid Java identifier. |
| private static void | checkOpcodeMethod(final int
the opcode to be checked. opcode, final CheckMethodAdapter.the expected visit method. methodChecks that the method to visit the given opcode is equal to the given method. |
| private static void | checkSignedByte(final int
the value to be checked. value, final String the message to use in case of error. message)Checks that the given value is a signed byte. |
| private static void | checkSignedShort(final int
the value to be checked. value, final String the message to use in case of error. message)Checks that the given value is a signed short. |
| pack-priv static void | checkUnqualifiedName(final int
the class version. version, final String the string to be checked. name, final String the message to use in case of error. message)Checks that the given string is a valid unqualified name. |
| private static void | checkUnsignedShort(final int
the value to be checked. value, final String the message to use in case of error. message)Checks that the given value is an unsigned short. |
| private void | |
| private void | |
| private void | |
| public void | visitAnnotableParameterCount(final int
the number of method parameters than can have annotations. This number
must be less or equal than the number of parameter types in the method descriptor. It can
be strictly less when a method has synthetic parameters and when these parameters are
ignored when computing parameter indices for the purpose of parameter annotations (see
https://docs.oracle.com/javase/specs/jvms/se9/html/jvms-4.html#jvms-4.7.18). parameterCount, final boolean true to define the number of method parameters that can have
annotations visible at runtime, false to define the number of method parameters
that can have annotations invisible at runtime. visible)Overrides org. |
| public AnnotationVisitor | visitAnnotation(final String
the class descriptor of the annotation class. descriptor, final boolean true if the annotation is visible at runtime. visible)
Visits an annotation of this method.
|
| public AnnotationVisitor | visitAnnotationDefault()
Overrides org. |
| public void | visitAttribute(final Attribute
an attribute. attribute)
Visits a non standard attribute of this method.
|
| public void | visitCode()
Overrides org. |
| public void | |
| public void | visitFieldInsn(final int
the opcode of the type instruction to be visited. This opcode is either
GETSTATIC, PUTSTATIC, GETFIELD or PUTFIELD. opcode, final String the internal name of the field's owner class (see owner, final String Type#getInternalName()).the field's name. name, final String the field's descriptor (see descriptor)
Visits a field instruction.
Type). |
| public void | visitFrame(final int
the type of this stack map frame. Must be type, final int Opcodes#F_NEW for expanded
frames, or Opcodes#F_FULL, Opcodes#F_APPEND, Opcodes#F_CHOP, Opcodes#F_SAME or Opcodes#F_APPEND, Opcodes#F_SAME1 for compressed frames.the number of local variables in the visited frame. Long and double values
count for one variable. numLocal, final Object[] the local variable types in this frame. This array must not be modified. Primitive
types are represented by local, final int Opcodes#TOP, Opcodes#INTEGER, Opcodes#FLOAT, Opcodes#LONG, Opcodes#DOUBLE, Opcodes#NULL or
Opcodes#UNINITIALIZED_THIS (long and double are represented by a single element).
Reference types are represented by String objects (representing internal names, see Type#getInternalName()), and uninitialized types by Label objects (this label designates
the NEW instruction that created this uninitialized value).the number of operand stack elements in the visited frame. Long and double
values count for one stack element. numStack, final Object[] the operand stack types in this frame. This array must not be modified. Its
content has the same format as the "local" array. stack)Overrides org. |
| public void | visitIincInsn(final int
index of the local variable to be incremented. varIndex, final int amount to increment the local variable by. increment)
Visits an IINC instruction.
|
| public void | visitInsn(final int
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. opcode)Overrides org. |
| public AnnotationVisitor | visitInsnAnnotation(final int
a reference to the annotated type. The sort of this type reference must be
typeRef, final TypePath 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, or TypeReference#METHOD_REFERENCE_TYPE_ARGUMENT. See TypeReference.the path to the annotated type argument, wildcard bound, array element type, or
static inner type within 'typeRef'. May be null if the annotation targets
'typeRef' as a whole. typePath, final String the class descriptor of the annotation class. descriptor, final boolean true if the annotation is visible at runtime. visible)Overrides org. |
| public void | visitIntInsn(final int
the opcode of the instruction to be visited. This opcode is either BIPUSH, SIPUSH
or NEWARRAY. opcode, final int the operand of the instruction to be visited. operand)When opcode is BIPUSH, operand value should be between Byte.MIN_VALUE and Byte.MAX_VALUE. When opcode is SIPUSH, operand value should be between Short.MIN_VALUE and Short.MAX_VALUE. When opcode is NEWARRAY, operand value should be one of Opcodes#T_BOOLEAN, Opcodes#T_CHAR, Opcodes#T_FLOAT, Opcodes#T_DOUBLE, Opcodes#T_BYTE,
Opcodes#T_SHORT, Opcodes#T_INT or Opcodes#T_LONG.Overrides org. |
| public void | visitInvokeDynamicInsn(final String
the method's name. name, final String the method's descriptor (see descriptor, final Handle Type).the bootstrap method. bootstrapMethodHandle, final Object... bootstrapMethodArguments)Overrides org. |
| public void | visitJumpInsn(final int
the opcode of the type instruction to be visited. This opcode is either 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 or IFNONNULL. opcode, final Label the operand of the instruction to be visited. This operand is a label that
designates the instruction to which the jump instruction may jump. label)
Visits a jump instruction.
|
| public void | visitLabel(final Label
a label)Label object.Overrides org. |
| public void | visitLdcInsn(final Object
the constant to be loaded on the stack. This parameter must be a non null value)Integer, a Float, a Long, a Double, a String, a Type of OBJECT or ARRAY sort for .class constants, for classes whose version is
49, a Type of METHOD sort for MethodType, a Handle for MethodHandle
constants, for classes whose version is 51 or a ConstantDynamic for a constant
dynamic for classes whose version is 55.Overrides org. |
| public void | visitLineNumber(final int
a line number. This number refers to the source file from which the class was
compiled. line, final Label the first instruction corresponding to this line number. start)
Visits a line number declaration.
|
| public void | visitLocalVariable(final String
the name of a local variable. name, final String the type descriptor of this local variable. descriptor, final String the type signature of this local variable. May be null if the local
variable type does not use generic types. signature, final Label the first instruction corresponding to the scope of this local variable
(inclusive). start, final Label the last instruction corresponding to the scope of this local variable (exclusive). end, final int the local variable's index. index)Overrides org. |
| public AnnotationVisitor | visitLocalVariableAnnotation(final int
a reference to the annotated type. The sort of this type reference must be
typeRef, final TypePath TypeReference#LOCAL_VARIABLE or TypeReference#RESOURCE_VARIABLE. See TypeReference.the path to the annotated type argument, wildcard bound, array element type, or
static inner type within 'typeRef'. May be null if the annotation targets
'typeRef' as a whole. typePath, final Label[] the fist instructions corresponding to the continuous ranges that make the scope
of this local variable (inclusive). start, final Label[] the last instructions corresponding to the continuous ranges that make the scope of
this local variable (exclusive). This array must have the same size as the 'start' array. end, final int[] the local variable's index in each range. This array must have the same size as
the 'start' array. index, final String the class descriptor of the annotation class. descriptor, final boolean true if the annotation is visible at runtime. visible)Overrides org. |
| public void | visitLookupSwitchInsn(final Label
beginning of the default handler block. dflt, final int[] the values of the keys. keys, final Label[] beginnings of the handler blocks. labels)labels[i] is the beginning of the
handler block for the keys[i] key.Overrides org. |
| public void | visitMaxs(final int
maximum stack size of the method. maxStack, final int maximum number of local variables for the method. maxLocals)Overrides org. |
| public void | visitMethodInsn(final int
the opcode of the type instruction to be visited. This opcode is either
INVOKEVIRTUAL, INVOKESPECIAL, INVOKESTATIC or INVOKEINTERFACE. opcodeAndSource, final String the internal name of the method's owner class (see owner, final String Type#getInternalName()).the method's name. name, final String the method's descriptor (see descriptor, final boolean Type).if the method's owner class is an interface. isInterface)
Visits a method instruction.
|
| public void | visitMultiANewArrayInsn(final String
an array type descriptor (see descriptor, final int Type).the number of dimensions of the array to allocate. numDimensions)Overrides org. |
| public void | visitParameter(final String
parameter name or null if none is provided. name, final int the parameter's access flags, only access)
Visits a parameter of this method.
ACC_FINAL, ACC_SYNTHETIC
or/and ACC_MANDATED are allowed (see Opcodes). |
| public AnnotationVisitor | visitParameterAnnotation(final int
the parameter index. This index must be strictly smaller than the number of
parameters in the method descriptor, and strictly smaller than the parameter count
specified in parameter, final String visitAnnotableParameterCount.Important Note a parameter index i is not required to correspond to the i'th parameter descriptor in the method descriptor, in particular in case of synthetic parameters (see https://docs.oracle.com/javase/specs/jvms/se9/html/jvms-4.html#jvms-4.7.18). the class descriptor of the annotation class. descriptor, final boolean true if the annotation is visible at runtime. visible)Overrides org. |
| public void | visitTableSwitchInsn(final int
the minimum key value. min, final int the maximum key value. max, final Label beginning of the default handler block. dflt, final Label... beginnings of the handler blocks. labels)labels[i] is the beginning of the
handler block for the min + i key.Overrides org. |
| public AnnotationVisitor | visitTryCatchAnnotation(final int
a reference to the annotated type. The sort of this type reference must be
typeRef, final TypePath TypeReference#EXCEPTION_PARAMETER. See TypeReference.the path to the annotated type argument, wildcard bound, array element type, or
static inner type within 'typeRef'. May be null if the annotation targets
'typeRef' as a whole. typePath, final String the class descriptor of the annotation class. descriptor, final boolean true if the annotation is visible at runtime. visible)Overrides org. |
| public void | visitTryCatchBlock(final Label
the beginning of the exception handler's scope (inclusive). start, final Label the end of the exception handler's scope (exclusive). end, final Label the beginning of the exception handler's code. handler, final String the internal name of the type of exceptions handled by the handler (see type)Type#getInternalName()), or null to catch any exceptions (for "finally"
blocks).Overrides org. |
| public AnnotationVisitor | visitTypeAnnotation(final int
a reference to the annotated type. The sort of this type reference must be
typeRef, final TypePath TypeReference#METHOD_TYPE_PARAMETER, TypeReference#METHOD_TYPE_PARAMETER_BOUND, TypeReference#METHOD_RETURN, TypeReference#METHOD_RECEIVER, TypeReference#METHOD_FORMAL_PARAMETER or TypeReference#THROWS. See TypeReference.the path to the annotated type argument, wildcard bound, array element type, or
static inner type within 'typeRef'. May be null if the annotation targets
'typeRef' as a whole. typePath, final String the class descriptor of the annotation class. descriptor, final boolean true if the annotation is visible at runtime. visible)Overrides org. |
| public void | visitTypeInsn(final int
the opcode of the type instruction to be visited. This opcode is either NEW,
ANEWARRAY, CHECKCAST or INSTANCEOF. opcode, final String the operand of the instruction to be visited. This operand must be the internal
name of an object or array class (see type)
Visits a type instruction.
Type#getInternalName()). |
| public void | visitVarInsn(final int
the opcode of the local variable instruction to be visited. This opcode is either
ILOAD, LLOAD, FLOAD, DLOAD, ALOAD, ISTORE, LSTORE, FSTORE, DSTORE, ASTORE or RET. opcode, final int the operand of the instruction to be visited. This operand is the index of a
local variable. varIndex)Overrides org. |