构建javaassist入门实例:
场景;
监控每个方法的执行时间
方式:
通过javaassist实现
代码:
package com.sirding;
import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.Instrumentation;
public class MyAgent {
private static Instrumentation inst = null;
public static void premain(String agentArgs, Instrumentation _inst){
System.out.println("PerfMonAgent.premian() was called.");
inst = _inst;
ClassFileTransformer trans = new MyTransform();
System.out.println("Adding a PerfMonXformer instance to the JVM.");
inst.addTransformer(trans);
}
}
package com.sirding;
import java.io.ByteArrayInputStream;
import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.IllegalClassFormatException;
import java.security.ProtectionDomain;
import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtBehavior;
import javassist.CtClass;
import javassist.NotFoundException;
public class MyTransform implements ClassFileTransformer{
@Override
public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
byte[] transformed = null;
System.out.println("Transforming " + className);
ClassPool pool = ClassPool.getDefault();
CtClass cl = null;
try {
cl = pool.makeClass(new ByteArrayInputStream(classfileBuffer));
if(!cl.isInterface()) {
CtBehavior[] methods = cl.getDeclaredBehaviors();
for(CtBehavior method : methods){
doMethod(method);
}
transformed = cl.toBytecode();
}
} catch (Exception e) {
e.printStackTrace();
}finally {
if(cl != null){
cl.detach();
}
}
return transformed;
}
private void doMethod(CtBehavior method) throws NotFoundException, CannotCompileException {
if("myTest".equalsIgnoreCase(method.getName())){
//添加局部变量,如果不同过addLocalVariable设置,在调用属性时将出现compile error: no such field: startTime
method.addLocalVariable("startTime", CtClass.longType);
method.insertBefore("System.out.println(startTime);");
method.insertBefor