JaCoCo 通过 Java Agent 机制实现代码覆盖率统计,其核心在于 CoverageTransformer
类。该类通过实现 ClassFileTransformer
接口,在类加载阶段对字节码进行实时插桩,注入覆盖率统计逻辑。
byte[] transform(ClassLoader loader,
String className,
Class<?> classBeingRedefined,
ProtectionDomain protectionDomain,
byte[] classfileBuffer)
throws IllegalClassFormatException
参数 | 说明 |
---|---|
loader | 类加载器,Bootstrap 加载器时为 null |
className | JVM 内部格式的类名(如 java/util/List) |
classBeingRedefined | 重定义/重转换触发的类对象,类加载时为 null |
protectionDomain | 类的保护域 |
classfileBuffer | 原始类文件字节数组(不可修改) |
返回值规则
转换器类型
执行顺序
不可重转换转换器 → 不可重转换原生转换器 → 可重转换转换器 → 可重转换原生转换器
ClassLoader.defineClass
加载新类时触发Instrumentation.redefineClasses
修改类定义时触发Instrumentation.retransformClasses
重新转换类时触发多个转换器按注册顺序形成处理链,前一个转换器的输出作为下一个的输入。这种链式处理机制使得各转换器可以协同工作。
// 输出示例:MyClass.7f3a1c58a3b2d045.class
void dump(String name, byte[] contents) throws IOException
<类名>.<16位CRC64校验码>.class
IllegalClassFormatException
:标识输入字节码格式错误Throwable
:防止未处理异常影响后续转换器场景 | 触发条件 | 典型应用 |
---|---|---|
新类加载 | 首次加载类文件 | 启动时插桩 |
动态类重定义 | 使用热部署工具 | 在线调试时代码替换 |
类重转换 | 调用 retransformClasses | 覆盖率数据动态重置 |
通过深入理解 CoverageTransformer 的工作机制,开发者可以更好地进行定制化插桩,实现精准的代码覆盖率统计和动态分析。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有