发布于2026-07-06 阅读(0)
扫一扫,手机访问
Ja vaAgent 的能力来源于 Instrumentation 接口,它是整个字节码增强体系的核心入口。理解 Ja vaAgent,关键就在于搞清楚这个接口是怎么工作的。简单说,它的核心思路是:在 JVM 加载类的过程中,悄悄把字节码给改了,从而实现各种增强效果。好处是不用动源码,也不用重启服务,特别适合监控、埋点、AOP 这一类场景。
在 Ja vaAgent 里,premain 和 agentmain 这两个方法会分别接收到一个 Instrumentation 实例——这就是所有增强操作的入口。跟其他 API 不同,这个实例是不能自己 new 出来的,必须由 JVM 在加载 Agent 时注入进去。
premain:在 JVM 启动时被调用,要求 META-INF/MANIFEST.MF 里声明 Premain-Class。agentmain:是运行时动态挂载用的,需要声明 Agent-Class,通常配合 Attach API 一起使用。Instrumentation 实例,不能自行构造,也不能替换。Instrumentation 提供了两种增强方式,分别针对不同时机。简单来说:
ClassFileTransformer 之后,以后每次加载新类,都会先经过这个 transformer 处理。可以在 transformer 里过滤包名,只处理关心的类。但问题来了——对于已经加载过的类,它是没有效果的。-XX:+RetransformClasses 参数。不过要注意,JVM 对字节码修改设了不少规矩,不能随便改。比如:
ClassWriter 里指定 COMPUTE_FRAMES,或者手动算好帧信息,否则很容易抛出 VerifyError。className 做一下过滤。落地的时候,有几个地方值得特别留意:
try-catch 把字节码修改的逻辑包起来,同时记录日志,方便排查问题。Instrumentation.isModifiableClass() 先检查一下这个类到底能不能改,避免直接触发 UnsupportedOperationException。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8