目录
- 2. Java字节码增强支持
- 4. Java字节码增强类库 - ASM
- 5. Java字节码增强类库 - Javassist
- 6. Java字节码增强工具/类库 - ByteBuddy
- 7. Java字节码增强工具对比和关系图
- 7.1 Java字节码增强工具对比
- 7.2 Java字节码增强工具关系图
最近为了实现Java应用RPC调用的录制和Mock回放,需要以无侵入方式获取到RPC方法的出入参数和返回响应消息等数据,于是踏上了Java字节码增强技术的道路摸索,这个非常类似Trace所使用的相关技术,不过需要深入到RPC方法级别,对指定方法进行无侵入方式切面处理。先后对ASM/Javaassist/Bytebuddy等技术进行了调研等,本文是对所做摸索探路工作的总结,若读者有类似Trace场景需求,可以进行借鉴参考。
在众多比较之后最后选择的是Bytebuddy技术。
1. Java字节码简介
Java字节码是众多字节码增强技术的知识基础。Java语言写出的源代码首先需要编译成class文件,即字节码文件,然后被JVM加载并运行,每个 class文件 具有如下固定的数据格式,
ClassFile { u4 magic; // 魔数,固定为0xCAFEBABE u2 minor_version; // 次版本 u2 major_version; // 主版本,常见版本:52对应1.8,51对应1.7,其他依次类推 u2 constant_pool_count; // 常量池个数 cp_info constant_pool[constant_pool_count-1]; // 常量池定义 u2 access_flags; // 访问标志:ACC_PUBLIC, ACC_INTERFACE, ACC_ABSTRACT等 u2 this_class; // 类索引 u2 super_class; // 父类索引 u2 interfaces_count; u2 interfaces[interfaces_count]; u2 fields_count; field_info fields[fields_count]; u2 methods_count; method_info methods[methods_count]; u2 attributes_count; attribute_info attributes[attributes_count]; }
可以看到,class文件总是一个魔数开头,后面跟着版本号,然后就是常量定义、访问标志、类索引、父类索引、接口个数和索引表、字段个数和索引表、方法个数和索引表、属性个数和索引表。
class文件本质上是一个字节码流,每个字节码所处的位置代表着一定的指令和含义。如何对class文件中定义的指令和字节码进行解读、增强定义、编排,这是字节码增强技术所要完成的事情。
了解Java字节码有助于字节码增强的开发,但并不是实现字节码增强开发的必要条件,最新主流的众多字节码增强工具框架类库都将字节码的编排进行了不同程度封装,在可读性、易编排性、排错性上提供开发便利性,学习曲线和开发难度得到了较好的改善。
2. Java字节码增强支持
对于字节码增强的开发来说,JVMTI是一个在实践中应该被熟悉的工具技术。JVM从1.5版本开始提供 JVM Tool Interface ,这是JVM对外的、用于Java应用监控和调试的一系列工具接口,是JVM平台调试架构的重要组成部分。
下图是 JVM平台调试架构图 ,
The Java™ Platform Debugger Architecture is structured as follows: Components