javassist重复增强及跟其他agent冲突问题
背景
有时候需要对服务进行调试,通过项目后门(接口)临时插入调试代码,用到javassist
的insertAt
,例如:
ctMethod.insertAt(45, "{ System.out.println(\"test\"); }");
调试完之后再清理
掉调试的代码,用的是transform
返回null
的方式:
public static class ResetClassFileTransformer implements ClassFileTransformer {
@Override
public byte[] transform(
ClassLoader loader,
String className,
Class<?> classBeingRedefined,
ProtectionDomain protectionDomain,
byte[] classfileBuffer) {
return null;
}
}
但是这种方式,如果在执行清理
之后,项目没有重启的情况下,再次通过项目后门插入调试代码,之前被清理掉的增强代码又会出现了,比如执行以下增加之后:
ctMethod.insertAt(45, "{ System.out.println(\"test2\"); }");
执行结果是:
test
test2
原因是因为javassist
的ClassPool
对CtClass
的增强会有缓存,所以我改为在清理
时,同时执行CtClass
的detach
方法。
改了之后确实也解决了以上的问题,但是发现如果项目有其他的agent
,并且该agent
也用javassist
做增强的话,在detach
之后再次增强,agent
的增强也会被清理掉。例如:
项目已有的
agent
里有insertBefore
是打印出before
,然后项目运行时通过后门执行insertAt
打印test
,这时候执行的结果是:before test
调试完之后执行
清理
(ResetClassFileTransformer
),这时候agent
的增强还在,所以执行的结果是:before
这时候再次增强,通过
insertAt
打印test2
,然而执行的结果是:test2
agent
的增强被清除了。
问题
要怎么做到可以重复的增强
-> 清除
,但是又不影响项目已经引入的其他agent
?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论