BTrace二三事之一:类转换方式和子类的匹配
以下基于BTrace1.2.2
[url]http://kenai.com/projects/btrace/downloads/directory/releases
[/url]
BTrace类的增强分两部分:
Agent载入之前已加载类的转换;
Agent载入之后新定义类的转换;
其中,Agent载入之前已加载类的转换在:
com.sun.btrace.agent.Main.handleNewClient(final Client client)方法中处理;
关键的处理步骤:
// 注册类转换器---即:ClassFileTransformerclient.registerTransformer();// 获取所有已加载的类Class[] classes = inst.getAllLoadedClasses();// 对所有已加载的类进行过滤,挑选出BTrace脚本需要跟踪的类,// 对于“+”标识的类,通过递归superClass和superInterfaces查找if(client.isCandidate(c))list.add(c);// 重转换已加载的需要跟踪的类---会导致之前注册的类转换器被调用,从而实现类的增强inst.retransformClasses(classes);
public byte[] transform(ClassLoader loader, final String cname, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer);即:transform方法中classBeingRedefined是否为null
{ BTraceRuntime.retransform(Ljava/lang/String;Ljava/lang/Class;)}void registerTransformer() { inst.addTransformer(clInitTransformer, false); inst.addTransformer(this, true);}