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");
}
}
/**********************************************************************/
} |
Partager