| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 
 |  
public byte[] transform(ClassLoader loader, String className, Class redefiningClass, ProtectionDomain domain, byte[] bytes) throws IllegalClassFormatException {
 
		System.out.println("--->Modifying: " + className);
 
		byte[] result = bytes;
		try {
 
				ClassReader reader = new ClassReader(bytes);
				ClassWriter writer = new ClassWriter(reader, ClassWriter.COMPUTE_MAXS);
				//TraceClassmv.visitor tcv = new TraceClassmv.visitor(writer,new PrintWriter(System.out));
				MyClassAdapter mca = new MyClassAdapter(writer /*tcv*/, className);
				reader.accept(mca , ClassReader.SKIP_DEBUG);
				result = writer.toByteArray();		
		}
		catch(Exception e) {
		    e.printStackTrace();
		}
		return result;
    }
 
/********************************ClassAdapter**************************************/	
 
    private class MyClassAdapter extends ClassAdapter {
 
		private String className;
 
		MyClassAdapter(ClassVisitor cv, String theClass) {
		    super(cv);
		    className = theClass;
		}
 
		@Override public void visit(int arg0, int access, String name, String signature,String superName, String[] interfaces) {
			cv.visit(arg0, access, name, signature, superName, interfaces);	
		}
 
		@Override public MethodVisitor visitMethod(int arg0, String name, String descriptor, String signature, String[] exceptions) {
		    MethodVisitor mv = cv.visitMethod(arg0, name, descriptor, signature, exceptions);
		    //Everytime I modify a method I will see the resulting method
			mv = new TraceMethodVisitor(mv){
				    @Override public void visitCode(){
				    		print(new PrintWriter(System.out));
				    }
			    };
 
		    return new MyMethodAdapter(mv,className,name,descriptor);
		}
    }
 
/********************************MethodAdapter**************************************/	
 
    private class MyMethodAdapter extends MethodAdapter {
	private String methodName;
	private String methodDescriptor;
	private String className;
	//private Methodmv.visitor mv.visitor;
 
	MyMethodAdapter(MethodVisitor mv, String theClass, String name, String descriptor) {
	    super(mv);
	    //this.mv.visitor = mv.visitor;
	    methodName = name;
	    methodDescriptor = descriptor;
	    className = theClass;
	}
 
		@Override public void visitCode() {
			//Every method print her name at the beginning
			mv.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
			mv.visitLdcInsn("Method " + className + "." + methodName + "(" + methodDescriptor + ") called");
			mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V");
 
		}
 
	}
 
/**********************************************************************/
} | 
Partager