| 2 | import javassist.*; |
| 3 | |
| 4 | public class Monitor { |
| 5 | final static ClassPool pool = ClassPool.getDefault(); |
| 6 | final static String classname = "examples.Student"; |
| 7 | public void studentLearnMonitor() throws Exception{ |
| 8 | CtClass ss = pool.getCtClass(classname); |
| 9 | CtClass.debugDump="./dump"; |
| 10 | String methodname = "learn"; |
| 11 | CtMethod learn_ori = ss.getDeclaredMethod(methodname); |
| 12 | //拷贝一份learn方法 |
| 13 | CtMethod learn_cp = CtNewMethod.copy(learn_ori,learn_ori.getName()+"_cp",ss,null); |
| 14 | //添加拷贝后的方法 |
| 15 | ss.addMethod(learn_cp); |
| 16 | //修改learn方法:原代码前后添加时间 |
| 17 | String src = "{"+ |
| 18 | "long start = System.currentTimeMillis();" + |
| 19 | learn_ori.getName()+"_cp($$);"+ |
| 20 | "long end = System.currentTimeMillis();"+ |
| 21 | "System.out.println(end-start);"+ |
| 22 | "}"; |
| 23 | learn_ori.setBody(src); |
| 24 | ss.toClass(); |
| 25 | //生成.class文件,主要用于调试,查看是否有代码片段被忽略 |
| 26 | //ss.writeFile(); |
| 27 | Student s = new Student(); |
| 28 | s.learn(); |
| 29 | } |
| 30 | |
| 31 | public void studentDisplayMonitor() throws Exception{ |
| 32 | CtClass ss = pool.getCtClass(classname); |
| 33 | CtClass.debugDump="./dump"; |
| 34 | //添加字段name |
| 35 | CtField param = new CtField(pool.get("java.lang.String"),"name", ss); |
| 36 | // 访问级别是 private |
| 37 | param.setModifiers(Modifier.PRIVATE); |
| 38 | // 初始值是 "Frankyu" |
| 39 | ss.addField(param, CtField.Initializer.constant("Frankyu")); |
| 40 | String methodname = "display"; |
| 41 | CtMethod display = ss.getDeclaredMethod(methodname); |
| 42 | String src = "{"+ |
| 43 | "System.out.println($0.age);" + |
| 44 | "$0.name=\"frankyu\";" + |
| 45 | "System.out.println($0.name);"+ |
| 46 | "}"; |
| 47 | display.insertBefore(src); |
| 48 | if(true){ |
| 49 | System.out.println("Hello javassist + 1"); |
| 50 | } |
| 51 | src ="if(true){" + |
| 52 | "System.out.println(\"Hello javassist +2\");" + |
| 53 | "}"; |
| 54 | display.insertAt(7,src); |
| 55 | src = "{"+ |
| 56 | "System.out.println($0.grade);"+ |
| 57 | "}"; |
| 58 | display.insertAfter(src); |
| 59 | ss.toClass(); |
| 60 | //ss.writeFile(); |
| 61 | Student s = new Student(); |
nothing calls this directly
no outgoing calls
no test coverage detected