开发测试
覆盖率
覆盖率技术原理
插装原理及方法
字节码处理方式
JaCoCo通过注入来修改和生成java字节码,使用的是ASM库。我们知道JaCoCo是字节码注入方式,它是通过一个Probe探针的方式来注入的,探针是字节指令集插入到java方法中,程序执行后可以被记录,它不会改变原有代码的行为。
颜色的部分就是探针注入的地方。
JaCoCo是根据控制流Type来采用不同的探针插入策略的。
一个用java字节码定义的java方法的控制流图可能有以下的type,每一个type连接一个源指令与目标指令,type不同探针的注入策略也会不同,如下是type定义:
探针不改变该方法的行为,但记录他们已被执行的事实,从理论上讲,可以在控制流图的每一个边插入一个探针,作为探针实现本身需要多个字节码指令,这将增加几倍的类文件的大小和执行速度。事实上,只需要一个几个探头,根据每个方法的控制流的方法,下面说明了如何在不同的边缘类型的情况下添加额外的指令:
0x2b aload_1 将第二个引用类型本地变量推送至栈顶
0x05 iconst_2 将int型2推送至栈顶
0x04 iconst_1 将int型1推送至栈顶
从操作数栈存存储到数组:bastore