J'arrive pas utiliser TraceMethodVisitor avec ASM.
c'est censé m'afficher le bytecode de la méthode une fois qu'elle a été modifié. Pourtant rien ne ce passe.

j'utilise un agent et une classe ClassFileTransformer pour modifier dynamiquement les classes lorsqu'elles sont lues pars la JVM

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
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");
 
		}
 
	}
 
/**********************************************************************/
}
Toute les méthodes sont modifiées pour tant aucun bytecode n'est affiché.
j'utilise mal le TraceMethodVisitor (pourtant j'ai fais exactement pareil que dans le asm-guide page 60)