org.objectweb.asm.commons

Class AdviceAdapter

Implemented Interfaces:
MethodVisitor, Opcodes

public abstract class AdviceAdapter
extends GeneratorAdapter
implements Opcodes

A MethodAdapter to insert before, after and around advices in methods and constructors.

The behavior for constructors is like this:

  1. as long as the INVOKESPECIAL for the object initialization has not been reached, every bytecode instruction is dispatched in the ctor code visitor
  2. when this one is reached, it is only added in the ctor code visitor and a JP invoke is added
  3. after that, only the other code visitor receives the instructions
Authors:
Eugene Kuleshov
Eric Bruneton

Field Summary

protected int
methodAccess
protected String
methodDesc

Fields inherited from class org.objectweb.asm.commons.GeneratorAdapter

ADD, AND, DIV, EQ, GE, GT, LE, LT, MUL, NE, NEG, OR, REM, SHL, SHR, SUB, USHR, XOR

Fields inherited from class org.objectweb.asm.commons.LocalVariablesSorter

firstLocal, nextLocal

Fields inherited from class org.objectweb.asm.MethodAdapter

mv

Fields inherited from interface org.objectweb.asm.Opcodes

AALOAD, AASTORE, ACC_ABSTRACT, ACC_ANNOTATION, ACC_BRIDGE, ACC_DEPRECATED, ACC_ENUM, ACC_FINAL, ACC_INTERFACE, ACC_NATIVE, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_STATIC, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_SYNTHETIC, ACC_TRANSIENT, ACC_VARARGS, ACC_VOLATILE, ACONST_NULL, ALOAD, ANEWARRAY, ARETURN, ARRAYLENGTH, ASTORE, ATHROW, BALOAD, BASTORE, BIPUSH, CALOAD, CASTORE, CHECKCAST, D2F, D2I, D2L, DADD, DALOAD, DASTORE, DCMPG, DCMPL, DCONST_0, DCONST_1, DDIV, DLOAD, DMUL, DNEG, DOUBLE, DREM, DRETURN, DSTORE, DSUB, DUP, DUP2, DUP2_X1, DUP2_X2, DUP_X1, DUP_X2, F2D, F2I, F2L, FADD, FALOAD, FASTORE, FCMPG, FCMPL, FCONST_0, FCONST_1, FCONST_2, FDIV, FLOAD, FLOAT, FMUL, FNEG, FREM, FRETURN, FSTORE, FSUB, F_APPEND, F_CHOP, F_FULL, F_NEW, F_SAME, F_SAME1, GETFIELD, GETSTATIC, GOTO, I2B, I2C, I2D, I2F, I2L, I2S, IADD, IALOAD, IAND, IASTORE, ICONST_0, ICONST_1, ICONST_2, ICONST_3, ICONST_4, ICONST_5, ICONST_M1, IDIV, IFEQ, IFGE, IFGT, IFLE, IFLT, IFNE, IFNONNULL, IFNULL, IF_ACMPEQ, IF_ACMPNE, IF_ICMPEQ, IF_ICMPGE, IF_ICMPGT, IF_ICMPLE, IF_ICMPLT, IF_ICMPNE, IINC, ILOAD, IMUL, INEG, INSTANCEOF, INTEGER, INVOKEINTERFACE, INVOKESPECIAL, INVOKESTATIC, INVOKEVIRTUAL, IOR, IREM, IRETURN, ISHL, ISHR, ISTORE, ISUB, IUSHR, IXOR, JSR, L2D, L2F, L2I, LADD, LALOAD, LAND, LASTORE, LCMP, LCONST_0, LCONST_1, LDC, LDIV, LLOAD, LMUL, LNEG, LONG, LOOKUPSWITCH, LOR, LREM, LRETURN, LSHL, LSHR, LSTORE, LSUB, LUSHR, LXOR, MONITORENTER, MONITOREXIT, MULTIANEWARRAY, NEW, NEWARRAY, NOP, NULL, POP, POP2, PUTFIELD, PUTSTATIC, RET, RETURN, SALOAD, SASTORE, SIPUSH, SWAP, TABLESWITCH, TOP, T_BOOLEAN, T_BYTE, T_CHAR, T_DOUBLE, T_FLOAT, T_INT, T_LONG, T_SHORT, UNINITIALIZED_THIS, V1_1, V1_2, V1_3, V1_4, V1_5, V1_6

Constructor Summary

AdviceAdapter(MethodVisitor mv, int access, String name, String desc)
Creates a new AdviceAdapter.

Method Summary

protected void
onMethodEnter()
Called at the beginning of the method or after super class class call in the constructor.
protected void
onMethodExit(int opcode)
Called before explicit exit from the method using either return or throw.
void
visitCode()
void
visitFieldInsn(int opcode, String owner, String name, String desc)
void
visitInsn(int opcode)
void
visitIntInsn(int opcode, int operand)
void
visitJumpInsn(int opcode, Label label)
void
visitLabel(Label label)
void
visitLdcInsn(Object cst)
void
visitLookupSwitchInsn(Label dflt, int[] keys, Label[] labels)
void
visitMethodInsn(int opcode, String owner, String name, String desc)
void
visitMultiANewArrayInsn(String desc, int dims)
void
visitTableSwitchInsn(int min, int max, Label dflt, Label[] labels)
void
visitTypeInsn(int opcode, String type)
void
visitVarInsn(int opcode, int var)

Methods inherited from class org.objectweb.asm.commons.GeneratorAdapter

arrayLength, arrayLoad, arrayStore, box, cast, catchException, checkCast, dup, dup2, dup2X1, dup2X2, dupX1, dupX2, endMethod, getField, getLocalType, getStatic, goTo, ifCmp, ifICmp, ifNonNull, ifNull, ifZCmp, iinc, instanceOf, invokeConstructor, invokeInterface, invokeStatic, invokeVirtual, loadArg, loadArgArray, loadArgs, loadArgs, loadLocal, loadLocal, loadThis, mark, mark, math, monitorEnter, monitorExit, newArray, newInstance, newLabel, not, pop, pop2, push, push, push, push, push, push, push, putField, putStatic, ret, returnValue, setLocalType, storeArg, storeLocal, storeLocal, swap, swap, tableSwitch, tableSwitch, throwException, throwException, unbox

Methods inherited from class org.objectweb.asm.commons.LocalVariablesSorter

newLocal, newLocalMapping, setLocalType, visitFrame, visitIincInsn, visitLocalVariable, visitMaxs, visitVarInsn

Methods inherited from class org.objectweb.asm.MethodAdapter

visitAnnotation, visitAnnotationDefault, visitAttribute, visitCode, visitEnd, visitFieldInsn, visitFrame, visitIincInsn, visitInsn, visitIntInsn, visitJumpInsn, visitLabel, visitLdcInsn, visitLineNumber, visitLocalVariable, visitLookupSwitchInsn, visitMaxs, visitMethodInsn, visitMultiANewArrayInsn, visitParameterAnnotation, visitTableSwitchInsn, visitTryCatchBlock, visitTypeInsn, visitVarInsn

Field Details

methodAccess

protected int methodAccess

methodDesc

protected String methodDesc

Constructor Details

AdviceAdapter

public AdviceAdapter(MethodVisitor mv,
                     int access,
                     String name,
                     String desc)
Creates a new AdviceAdapter.
Parameters:
mv - the method visitor to which this adapter delegates calls.
access - the method's access flags (see Opcodes).
name - the method's name.
desc - the method's descriptor (see Type).

Method Details

onMethodEnter

protected void onMethodEnter()
Called at the beginning of the method or after super class class call in the constructor.

Custom code can use or change all the local variables, but should not change state of the stack.

onMethodExit

protected void onMethodExit(int opcode)
Called before explicit exit from the method using either return or throw. Top element on the stack contains the return value or exception instance. For example:
   public void onMethodExit(int opcode) {
     if(opcode==RETURN) {
         visitInsn(ACONST_NULL);
     } else if(opcode==ARETURN || opcode==ATHROW) {
         dup();
     } else {
         if(opcode==LRETURN || opcode==DRETURN) {
             dup2();
         } else {
             dup();
         }
         box(Type.getReturnType(this.methodDesc));
     }
     visitIntInsn(SIPUSH, opcode);
     visitMethodInsn(INVOKESTATIC, owner, "onExit", "(Ljava/lang/Object;I)V");
   }

   // an actual call back method
   public static void onExit(int opcode, Object param) {
     ...
 


Custom code can use or change all the local variables, but should not change state of the stack.
Parameters:
opcode - one of the RETURN, IRETURN, FRETURN, ARETURN, LRETURN, DRETURN or ATHROW

visitCode

public void visitCode()
Specified by:
visitCode in interface MethodVisitor
Overrides:
visitCode in interface MethodAdapter

visitFieldInsn

public void visitFieldInsn(int opcode,
                           String owner,
                           String name,
                           String desc)
Specified by:
visitFieldInsn in interface MethodVisitor
Overrides:
visitFieldInsn in interface MethodAdapter

visitInsn

public void visitInsn(int opcode)
Specified by:
visitInsn in interface MethodVisitor
Overrides:
visitInsn in interface MethodAdapter

visitIntInsn

public void visitIntInsn(int opcode,
                         int operand)
Specified by:
visitIntInsn in interface MethodVisitor
Overrides:
visitIntInsn in interface MethodAdapter

visitJumpInsn

public void visitJumpInsn(int opcode,
                          Label label)
Specified by:
visitJumpInsn in interface MethodVisitor
Overrides:
visitJumpInsn in interface MethodAdapter

visitLabel

public void visitLabel(Label label)
Specified by:
visitLabel in interface MethodVisitor
Overrides:
visitLabel in interface MethodAdapter

visitLdcInsn

public void visitLdcInsn(Object cst)
Specified by:
visitLdcInsn in interface MethodVisitor
Overrides:
visitLdcInsn in interface MethodAdapter

visitLookupSwitchInsn

public void visitLookupSwitchInsn(Label dflt,
                                  int[] keys,
                                  Label[] labels)

visitMethodInsn

public void visitMethodInsn(int opcode,
                            String owner,
                            String name,
                            String desc)
Specified by:
visitMethodInsn in interface MethodVisitor
Overrides:
visitMethodInsn in interface MethodAdapter

visitMultiANewArrayInsn

public void visitMultiANewArrayInsn(String desc,
                                    int dims)
Specified by:
visitMultiANewArrayInsn in interface MethodVisitor
Overrides:
visitMultiANewArrayInsn in interface MethodAdapter

visitTableSwitchInsn

public void visitTableSwitchInsn(int min,
                                 int max,
                                 Label dflt,
                                 Label[] labels)

visitTypeInsn

public void visitTypeInsn(int opcode,
                          String type)
Specified by:
visitTypeInsn in interface MethodVisitor
Overrides:
visitTypeInsn in interface MethodAdapter

visitVarInsn

public void visitVarInsn(int opcode,
                         int var)
Specified by:
visitVarInsn in interface MethodVisitor
Overrides:
visitVarInsn in interface LocalVariablesSorter