原方法类:
package util;
public class StringUtilTest {
public String addString(int length){
StringBuilder sb=new StringBuilder();
for (int i = 0; i <length ; i++) {
sb.append(i % 26 + "a");
}
return sb.toString();
}
}
增强:
package javassist;
import util.StringUtilTest;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class ModifyMethod {
public static void main(String[] args) throws NotFoundException, CannotCompileException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
ClassPool classPool = new ClassPool(true);
/**
* 注意StringUtilTest.class.getName()虽然可以获取全类名,但会把类提前加载进了内存。
*/
String classname="util.StringUtilTest";
CtClass ctClass = classPool.get(classname);
/**
* 需要增强的方法--addString(int length):字符串拼接
* 添加:方法体执行时间
* $proxy:任意字符,例:xxx
*/
CtMethod ctMethod = ctClass.getDeclaredMethod("addString");
CtMethod method = CtNewMethod.copy(ctMethod, ctMethod.getName() + "$proxy", ctClass, null);
ctClass.addMethod(method);
/**
* addString方法体
* $$:自动参数填充
*/
StringBuffer sb = new StringBuffer();
sb.append("{")
.append("long begin = System.nanoTime();;")
.append("String result=").append(method.getName()).append("($$);")
.append("long end = System.nanoTime();")
.append("System.out.println(end-begin+\"--ns\");")
.append("return result;")
.append("}");
ctMethod.setBody(sb.toString());
Class<?> clz = ctClass.toClass();
Method m = clz.getMethod("addString",int.class);
m.invoke(clz.newInstance(),10000);
}
}