1+ package name .dhruba .javaagent ;
2+
3+ import java .lang .instrument .ClassFileTransformer ;
4+ import java .lang .instrument .IllegalClassFormatException ;
5+ import java .security .ProtectionDomain ;
6+
7+ import org .objectweb .asm .ClassWriter ;
8+ import org .objectweb .asm .Label ;
9+ import org .objectweb .asm .MethodVisitor ;
10+ import org .objectweb .asm .Opcodes ;
11+ import org .slf4j .Logger ;
12+ import org .slf4j .LoggerFactory ;
13+
14+ public class MyClassFileTransformer implements ClassFileTransformer , Opcodes {
15+
16+ static final Logger logger = LoggerFactory .getLogger (MyClassFileTransformer .class );
17+
18+ @ Override
19+ public byte [] transform (ClassLoader loader , String className , Class <?> classBeingRedefined ,
20+ ProtectionDomain protectionDomain , byte [] classfileBuffer )
21+ throws IllegalClassFormatException {
22+ logger .info ("class file transformer invoked for className: {}" , className );
23+
24+ if (className .equals ("name/dhruba/user/MyUser" )) {
25+
26+ ClassWriter cw = new ClassWriter (0 );
27+ MethodVisitor mv ;
28+
29+ cw .visit (V1_6 , ACC_PUBLIC + ACC_SUPER , "name/dhruba/user/MyUser" , null ,
30+ "java/lang/Object" , null );
31+
32+ cw .visitSource (null , null );
33+
34+ {
35+ mv = cw .visitMethod (ACC_PUBLIC , "<init>" , "()V" , null , null );
36+ mv .visitCode ();
37+ Label l0 = new Label ();
38+ mv .visitLabel (l0 );
39+ mv .visitLineNumber (3 , l0 );
40+ mv .visitVarInsn (ALOAD , 0 );
41+ mv .visitMethodInsn (INVOKESPECIAL , "java/lang/Object" , "<init>" , "()V" );
42+ mv .visitInsn (RETURN );
43+ Label l1 = new Label ();
44+ mv .visitLabel (l1 );
45+ mv .visitLocalVariable ("this" , "Lname/dhruba/user/MyUser;" , null , l0 , l1 , 0 );
46+ mv .visitMaxs (1 , 1 );
47+ mv .visitEnd ();
48+ }
49+ {
50+ mv = cw .visitMethod (ACC_PUBLIC , "getName" , "()Ljava/lang/String;" , null , null );
51+ mv .visitCode ();
52+ Label l0 = new Label ();
53+ mv .visitLabel (l0 );
54+ mv .visitLineNumber (6 , l0 );
55+ mv .visitLdcInsn ("bar" );
56+ mv .visitInsn (ARETURN );
57+ Label l1 = new Label ();
58+ mv .visitLabel (l1 );
59+ mv .visitLocalVariable ("this" , "Lname/dhruba/user/MyUser;" , null , l0 , l1 , 0 );
60+ mv .visitMaxs (1 , 1 );
61+ mv .visitEnd ();
62+ }
63+ cw .visitEnd ();
64+
65+ return cw .toByteArray ();
66+ }
67+
68+ return classfileBuffer ;
69+ }
70+
71+ }
0 commit comments