Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >JaCoCo 字节码插桩机制解析:CoverageTransformer 与 transform 方法

JaCoCo 字节码插桩机制解析:CoverageTransformer 与 transform 方法

作者头像
JavaEdge
发布于 2025-06-01 04:16:19
发布于 2025-06-01 04:16:19
6600
代码可运行
举报
文章被收录于专栏:JavaEdgeJavaEdge
运行总次数:0
代码可运行

一、核心机制概述

JaCoCo 通过 Java Agent 机制实现代码覆盖率统计,其核心在于 CoverageTransformer 类。该类通过实现 ClassFileTransformer 接口,在类加载阶段对字节码进行实时插桩,注入覆盖率统计逻辑。

transform 方法流程图
transform 方法流程图

二、ClassFileTransformer 接口实现

2.1 transform 方法参数解析
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

原始类文件字节数组(不可修改)

2.2 方法特性说明

返回值规则

  • 返回修改后的字节数组:应用插桩逻辑
  • 返回 null:保持原始字节码不变
  • 抛出异常:效果等同于返回 null

转换器类型

  • 不可重转换型:仅处理类加载和重定义事件
  • 可重转换型:额外处理重转换事件

执行顺序

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
不可重转换转换器 → 不可重转换原生转换器 → 可重转换转换器 → 可重转换原生转换器

三、字节码转换流程

3.1 处理阶段
  • 类加载:通过 ClassLoader.defineClass 加载新类时触发
  • 类重定义:通过 Instrumentation.redefineClasses 修改类定义时触发
  • 类重转换:通过 Instrumentation.retransformClasses 重新转换类时触发
3.2 转换链机制

多个转换器按注册顺序形成处理链,前一个转换器的输出作为下一个的输入。这种链式处理机制使得各转换器可以协同工作。

四、ClassFileDumper 调试工具

4.1 核心功能
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 输出示例:MyClass.7f3a1c58a3b2d045.class
void dump(String name, byte[] contents) throws IOException
  • 按包结构生成目录层级
  • 文件名格式:<类名>.<16位CRC64校验码>.class
  • 用于验证插桩结果和调试字节码修改过程
4.2 文件生成逻辑
  1. 根据类名解析包路径
  2. 计算字节数组 CRC64 校验码
  3. 拼接生成唯一文件名
  4. 写入指定目录

五、异常处理与最佳实践

5.1 异常处理策略
  • 抛出 IllegalClassFormatException:标识输入字节码格式错误
  • 捕获所有 Throwable:防止未处理异常影响后续转换器
5.2 性能优化建议
  • 避免不必要的字节码修改(快速返回 null)
  • 确保线程安全(多个类可能并行加载)
  • 合理使用类过滤机制(通过 className 快速筛选目标类)

六、应用场景分析

场景

触发条件

典型应用

新类加载

首次加载类文件

启动时插桩

动态类重定义

使用热部署工具

在线调试时代码替换

类重转换

调用 retransformClasses

覆盖率数据动态重置

通过深入理解 CoverageTransformer 的工作机制,开发者可以更好地进行定制化插桩,实现精准的代码覆盖率统计和动态分析。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-03-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JVM 字节码增强技术之 Java Agent 入门
分布式链路追踪中为了获取服务之间调用链信息,采集器通常需要在方法的前后做埋点。在 Java 生态中,常见的埋点方式有两种:
高楼Zee
2021/10/27
1.5K0
认识 JavaAgent --获取目标进程已加载的所有类
之前在一个应用中搜索到一个类,但是在反序列化测试时出错,错误不是class notfound,是其他0xxx这样的错误,通过搜索,这个错误大概是类没有被加载。最近刚好看到了JavaAgent,初步学习了下,能进行拦截,主要通过Instrument Agent来进行字节码增强,可以进行字节码插桩,bTrace,Arthas 等操作,结合ASM,javassist,cglib框架能实现更强大的功能。Java RASP也是基于JavaAgent实现的。趁热记录下JavaAgent基础概念,以及简单使用JavaAgent实现一个获取目标进程已加载的类的测试。
Seebug漏洞平台
2019/12/16
2.3K0
认识 JavaAgent --获取目标进程已加载的所有类
深入字节码 -- 计算方法执行时间 原
java程序通过javac编译之后生成文件.class就是字节码集合,正是有这样一种中间码(字节码),使得scala/groovy/clojure等函数语言只用实现一个编译器即可运行在JVM上。 看看一段简单代码。
九州暮云
2019/08/21
1.2K1
Java 动态字节码技术
初学 Java 时,我对 IDEA 的 Debug 非常好奇,不止是它能查看断点的上下文环境,更神奇的是我可以在断点处使用它的 Evaluate 功能直接执行某些命令,进行一些计算或改变当前变量。
枕边书
2019/01/03
2.1K0
字节码使用方法与组件封装方法详细指南
下面我将为你提供字节码相关的使用方法和组件封装方法,帮助你更好地理解和应用字节码技术。
用户4124626
2025/06/13
940
字节码使用方法与组件封装方法详细指南
浅谈 Java Agent 内存马
https://www.yuque.com/tianxiadamutou/zcfd4v/tdvszq
亿人安全
2022/06/30
2.6K0
浅谈 Java Agent 内存马
Java Agent(一)、初步认识Instrumentation
Instrumentation 是 Java SE 5 引入的一套 API,它允许开发者在运行时修改类的字节码。Java Instrumentation 可以实现在方法插入额外的字节码从而达到收集使用中的数据到指定工具的目的。Java.lang.instrument包的最大功能就是可以在已有的类上附加(修改)字节码来实现增强的逻辑,它最常见的用途包括:
有一只柴犬
2024/12/10
2970
Java Agent(一)、初步认识Instrumentation
深入理解Instrument(一)
很早之前就了解到目前主流的APM开源框架如Pinpoint、SkyWalking等等都是通过java.lang.instrument包提供的字节码增强功能来实现的。趁着对这块的热情还没消退,抽时间分析一下java.lang.instrument包的使用方式,记录下来写成一个系列的文章。本系列博文针对的是JDK11,其他版本的JDK可能不适合。
Throwable
2020/06/23
3K0
深入理解Instrument(一)
java agent使用与agent内存马
本质是一个jar包中的类,有两种实现,第一种是通过permain()函数实现。这种javaagent会在宿主程序的main函数的启动前启动自己premain函数,这时候会得到一个Instrumentation对象,我们可以通过Instrumentation对象对还未加载的class进行拦截与修改。
红队蓝军
2022/05/17
1.2K0
java agent使用与agent内存马
JVMTM Tool Interface:JVM源码分析之javaagent原理完全解读
本文重点讲述javaagent的具体实现,因为它面向的是我们Java程序员,而且agent都是用Java编写的,不需要太多的C/C++编程基础,不过这篇文章里也会讲到JVMTIAgent(C实现的),因为javaagent的运行还是依赖于一个特殊的JVMTIAgent。
一个会写诗的程序员
2020/05/18
1.7K0
JVMTM Tool Interface:JVM源码分析之javaagent原理完全解读
Java agent 与 byte buddy
Java 中实现agent 中对类的修改 实际上是要实现instrument 包下的 ClassFileTransformer 接口并实现。
猎户星座1
2020/08/10
2K0
Java基础知识:探针技术
启动前探针使用方式比较局限,而且每次探针更改的时候,都需要重新启动应用,而主程序之后的探针程序就可以直接连接到已经启动的 jvm 中。可以实现例如动态替换类,查看加载类信息的一些功能。
DioxideCN
2022/08/05
1.5K0
调研字节码插桩技术,用于系统监控设计和实现
周末熟睡的深夜,突然接到老板电话☎的催促。“赶紧看微信、看微信,咋系统出问题了,我们都不知道,还得用户反馈才知道的!!!”深夜爬起来,打开电脑连上 VPN ,打着哈欠、睁开朦胧的眼睛,查查系统日志,原来是系统挂了,赶紧重启恢复!
小傅哥
2021/07/23
1.2K0
java agent使用与agent内存马
本质是一个jar包中的类,有两种实现,第一种是通过permain()函数实现。这种javaagent会在宿主程序的main函数的启动前启动自己premain函数,这时候会得到一个Instrumentation对象,我们可以通过Instrumentation对象对还未加载的class进行拦截与修改。
红队蓝军
2022/04/13
1.4K0
java agent使用与agent内存马
JavaAgent+ASM字节码插桩采集方法名称以及入参和出参结果并记录方法耗时
在我们实际的业务开发到上线的过程中,中间都会经过测试。那么怎么来保证测试质量呢?比如;提交了多少代码、提交了多少方法、有单元测试吗、影响了那些流程链路、有没有夹带上线。
小傅哥
2020/04/07
3.2K1
JavaAgent+ASM字节码插桩采集方法名称以及入参和出参结果并记录方法耗时
谈谈Java Agent技术的实现
Java Agent本质上可以理解为一个插件,该插件就是一个精心提供的Jar包,这个Jar包通过JVMTI(JVM Tool Interface)完成加载,最终借助JPLISAgent(Java Programming Language Instrumentation Services Agent)完成对目标代码的修改。
FB客服
2022/11/14
4120
谈谈Java Agent技术的实现
Java代理技术解密:揭秘方法计时器的神奇实现
最近在了不起在与外部交流的时候,Java的agent技术被提起,想来自己都有些时间没有使用它了,本文简单讲讲什么是agent技术,并结合一个方法计时器的实际例子。
灬沙师弟
2023/07/08
2110
Java代理技术解密:揭秘方法计时器的神奇实现
字节码调试的入口 —— JVM 的寄生插件 javaagent 那些事
Java Instrumentation 这个技术看起来非常神秘,很少有书会详细介绍。但是有很多工具是基于 Instrumentation 来实现的:
架构狂人
2023/08/16
1K0
字节码调试的入口 —— JVM 的寄生插件 javaagent 那些事
javaAgent通过字节码对方法增强和使用 byte-buddy 来实现类的增强
在上一篇讲述了入门和实操https://cloud.tencent.com/developer/article/2360594 本章节使用字节码和byte-buddy来玩
杨不易呀
2023/11/19
1.3K0
javaAgent通过字节码对方法增强和使用 byte-buddy 来实现类的增强
教你用Java字节码做日志脱敏工具
本篇是本系列的最后一篇,在这篇中教你用ASM实际开发中做一些可用的东西。包括之前说的如何修改toString,完成一些脱敏。
用户5397975
2019/10/13
1.7K0
相关推荐
JVM 字节码增强技术之 Java Agent 入门
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验