retransformClasses是因为agent虽然嵌入了,但是在虚拟机启动的时候,某些类比如thread,在javaagent启动之前就已经加载到了内存,javaagent也是类,在javaagent加载之前虚拟机需要加载一些必须的类来保证我的javaagent的运行,比如说thread,这个时候thread就没有被”穿上衣服“,即没有被transform修饰,也就不能被javaagent监控到,这个时候就需要retransformClasses重新加载,注意retransformClasses会让没有被”穿上衣服的类”穿上衣服“

 

//需要将业务类进行retransform一下,这样可以避免在transform执行的时候,找不到此类的情况
for (Class<?> clazz : classes) {
for (CodePadClassMethodEntity entity : codePadEntity.getEnhanceClasses().keySet()) {
if (clazz.getName().contains(entity.getClassName())) {
try {
inst.retransformClasses(clazz);
} catch (UnmodifiableClassException e) {
log.error("retransform class fail:" + clazz.getName(), e);
}
}
}
}
//进行增强操作
inst.addTransformer(new CodePadPluginBizInvoker(codePadEntity), true);
posted on 2022-01-18 20:49  程序诗人  阅读(487)  评论(0编辑  收藏  举报