Byteman 是一个工具,可以轻松跟踪、监视和测试 Java 应用程序和 JDK 运行时代码的行为。
Byteman的规则引擎使跟踪程序执行、更改变量和返回您喜欢的语句变得非常容易。
Byteman 最简单的用途是注入打印语句来跟踪您的应用程序正在做什么,通过代码识别控制流并显示静态或实例数据的值。这可用于监视或调试实时部署以及检测被测代码,以确保它已正确运行。
Byteman BMUnit 包将 Byteman 与 JUnit 和 TestNG 集成在一起,使您可以轻松地使用 Byteman 来扩展单元和集成测试的范围。BMUnit 很容易集成到 maven 和 ant 项目中。
工作原理
Byteman 通过在运行时修改应用程序类的字节码来工作。然而,与许多其他字节码转换器不同,它在 Java 级别而不是字节码级别上运行。你给 Byteman 一个或多个规则来指定你想要执行的 Java 代码,以及你想要注入的应用程序或运行时类的方法中的位置。Byteman 研究如何重写字节码,使其表现得就像原始 Java 代码包含您请求的源代码级别更改一样。由于 Byteman 只需要访问字节码,这意味着它可以修改源不可用或无法重新编译的库代码。这甚至包括构成 Java 虚拟机一部分的 Java 代码、String、Thread 等类。所以,
Byteman 使用一种清晰、简单的脚本语言,基于称为事件条件操作 (ECA) 规则的形式来指定原始 Java 代码应在何处、何时以及如何进行转换。一个事件指定了一个触发点,一个您想要注入代码的位置。当执行到达触发点时,将评估规则的条件,即 Java 布尔表达式。仅当条件评估为真时,才会执行规则操作中的 Java 表达式(或表达式序列)。通常,一旦执行了注入的代码,就会从触发点继续执行。然而,规则动作可能包括返回或抛出表达式,分别从触发方法强制正常或异常返回。
Byteman 提供了一套内置的“便利”功能,您可以从规则条件和操作中调用这些功能。它们允许您执行范围广泛的有用操作,从简单的消息输出或堆栈转储到复杂错误流的传播,其中多个规则在应用程序的不同部分引入协调操作。
但是,您不仅限于这些标准的内置操作。只要它们引用的类和实例在注入点的范围内,您就可以将任何 Java 表达式注入到您的应用程序中。您还可以通过提供 POJO(普通的旧 java 对象)作为插件来替换或扩展可用的内置函数。
Byteman 将规则代码动态链接到目标方法上下文中,在可能的情况下自动推断值和表达式的类型,并确保生成的代码是类型安全的,并且不会破坏由触发器方法的签名定义的类型协定。即使是最复杂的测试场景,Byteman 也能轻松编程。
Byteman 4.0.18 现在可以在 GNU LGPL 下下载。它需要 JDK 7 或更高版本的 JVM(如果您仍在使用 JDK 6,请使用最新的 3.X 版本)。该版本包括程序员指南,也可在线获得( pdf 或 html ),它提供了 Byteman 的功能、操作方式和使用方式的完整描述,包括所有可用的运行时配置选项。