62,634
社区成员




CtMethod ctMethod = ctClass.getDeclaredMethod(methodName);// 得到这方法实例
// 创建新的方法,复制原来的方法,名字为原来的名字
CtMethod newMethod = CtNewMethod.copy(ctMethod, methodName, ctClass, null);
// 定义一个方法名用于描述修改字节码之前的原方法
String oldMethodName = methodName + "$old";
// 将原方法名称修改掉,避免和新添加的方法同名冲突
ctMethod.setName(oldMethodName);
// 构建新的方法体
StringBuilder bodyStr = new StringBuilder();
bodyStr.append("{");
bodyStr.append("long startTime = System.currentTimeMillis();\n");
// 调用原方法代码,类似于method();($$)表示所有的参数
bodyStr.append(oldMethodName).append("($$);\n");
bodyStr.append("long endTime = System.currentTimeMillis();\n");
String outputStr = "System.out.println(\"this method " + methodName
+ " cost:\" +(endTime - startTime) +\"ms.\");\n";
bodyStr.append(outputStr);
bodyStr.append("}");
// 设置新的目标方法的方法体
newMethod.setBody(bodyStr.toString());
// 增加新方法, 原来的方法已经被修改名称为 oldMethodName,调用时会调用到新的目标方法
ctClass.addMethod(newMethod);