private MethodVisitor addMethod(int access, String name, String desc, String signature, String[] exceptions) { return super.visitMethod(access, name, desc, signature, exceptions); }
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions); return new ObjectAllocInstrumentor(mv, args[0], args[0], access, name, desc) { @Override protected void afterObjectNew(String desc) { println("after allocating an object of " + desc); } @Override protected void beforeObjectNew(String desc) { println("before allocating an object of " + desc); } }; } });
protected MethodVisitor addMethod(int access, String name, String desc, String signature, String[] exceptions) { MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions); return new MethodVisitor(Opcodes.ASM4, mv) { @Override public AnnotationVisitor visitAnnotation(String string, boolean bln) { return null; } @Override public AnnotationVisitor visitAnnotationDefault() { return null; } @Override public void visitFrame(int i, int i1, Object[] os, int i2, Object[] os1) { if (keepStackMap) super.visitFrame(i, i1, os, i2, os1); } }; }
@Override public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] throwables) { return new MethodVisitor(Opcodes.ASM4, super.visitMethod(access, name, desc, signature, throwables)) { @Override public void visitTypeInsn(int opcode, String type) { if (opcode == Opcodes.NEW && "java/lang/StringBuilder".equals(type)) { visitMethodInsn(Opcodes.INVOKESTATIC, Verifier.INLINED_INSTR_MARKER, Verifier.INLINED_INSTR_START, "()V"); } super.visitTypeInsn(opcode, type); } @Override public void visitMethodInsn(int opcode, String owner, String name, String desc) { super.visitMethodInsn(opcode, owner, name, desc); if ("java/lang/StringBuilder".equals(owner) && "toString".equals(name)) { visitMethodInsn(Opcodes.INVOKESTATIC, Verifier.INLINED_INSTR_MARKER, Verifier.INLINED_INSTR_END, "()V"); } } }; }
@Override public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] throwables) { return new MethodVisitor(Opcodes.ASM4, super.visitMethod(access, name, desc, signature, throwables)) { @Override public void visitTypeInsn(int opcode, String type) { if (opcode == Opcodes.NEW && "java/lang/StringBuilder".equals(type)) { visitMethodInsn(Opcodes.INVOKESTATIC, Verifier.INLINED_INSTR_MARKER, Verifier.INLINED_INSTR_START, "()V"); } super.visitTypeInsn(opcode, type); } @Override public void visitMethodInsn(int opcode, String owner, String name, String desc) { super.visitMethodInsn(opcode, owner, name, desc); if ("java/lang/StringBuilder".equals(owner) && "toString".equals(name)) { visitMethodInsn(Opcodes.INVOKESTATIC, Verifier.INLINED_INSTR_MARKER, Verifier.INLINED_INSTR_END, "()V"); } } }; }
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions); return new ArrayAccessInstrumentor(mv, args[0], args[0], access, name, desc) { @Override protected void onAfterArrayLoad(int opcode) { println("after array load"); } @Override protected void onAfterArrayStore(int opcode) { println("after array store"); } @Override protected void onBeforeArrayLoad(int opcode) { println("before array load"); } @Override protected void onBeforeArrayStore(int opcode) { println("before array store"); } }; } });
@Override public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { if (!shortSyntax) return super.visitMethod(access, name, desc, signature, exceptions); if ((access & (Opcodes.ACC_PUBLIC | Opcodes.ACC_PRIVATE)) == 0) { access &= ~Opcodes.ACC_PROTECTED; access |= Opcodes.ACC_PUBLIC; } final int localVarOffset = ((access & Opcodes.ACC_STATIC) == 0) ? -1 : 0; access |= Opcodes.ACC_STATIC; boolean isconstructor = false; if ("<init>".equals(name)) { name = "<clinit>"; isconstructor = true; } MethodVisitor mv = new MethodConvertor(localVarOffset, isconstructor, super.visitMethod(access, name, desc, signature, exceptions)); return mv; }
@Override public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { if (!shortSyntax) return super.visitMethod(access, name, desc, signature, exceptions); if ((access & (Opcodes.ACC_PUBLIC | Opcodes.ACC_PRIVATE)) == 0) { access &= ~Opcodes.ACC_PROTECTED; access |= Opcodes.ACC_PUBLIC; } final int localVarOffset = ((access & Opcodes.ACC_STATIC) == 0) ? -1 : 0; access |= Opcodes.ACC_STATIC; boolean isconstructor = false; if ("<init>".equals(name)) { name = "<clinit>"; isconstructor = true; } MethodVisitor mv = new MethodConvertor(localVarOffset, isconstructor, super.visitMethod(access, name, desc, signature, exceptions)); return mv; }
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions); return new CatchInstrumentor(mv, args[0], args[0], access, name, desc); } });
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions); return new SynchronizedInstrumentor(mv, null, className, className, access, name, desc); } });
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions); return new MethodEntryInstrumentor(mv, args[0], args[0], access, name, desc); } });
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions); return new MethodCallInstrumentor(mv, args[0], args[0], access, name, desc); } });
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions); return new TypeCheckInstrumentor(mv, args[0], args[0], access, name, desc); } });
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions); return new LineNumberInstrumentor(mv, args[0], args[0], access, name, desc); } });
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions); return new MethodReturnInstrumentor(mv, null, args[0], args[0], access, name, desc); } });
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions); return new ThrowInstrumentor(mv, args[0], args[0], access, name, desc); } });
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions); return new ErrorReturnInstrumentor(mv, null, args[0], args[0], access, name, desc); } });
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions); return new MethodEntryExitInstrumentor(mv, null, args[0], args[0], access, name, desc); } });
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions); return new ArrayAllocInstrumentor(mv, args[0], args[0], access, name, desc); } });
public static void generateTimeStampGetter(ClassVisitor cv) { MethodVisitor timestamp = cv.visitMethod(ACC_STATIC + ACC_PRIVATE + ACC_FINAL, TIME_STAMP_NAME, "()J", null, new String[0]); timestamp.visitCode(); timestamp.visitMethodInsn(INVOKESTATIC, "java/lang/System", "nanoTime", "()J"); timestamp.visitInsn(LRETURN); timestamp.visitMaxs(1, 0); timestamp.visitEnd(); }