bytebuddy介绍
介绍完了JVM TI和Attach和instrument ,是不是觉得自己可以动手对用户程序魔改了。其实还是很困难,bytebuddy可以帮助你做字节码修改。
作者的文章 了解作者写这个意图
官网入门教程看完后会似懂非懂的模仿用
github源码
byte buddy 源码分析 带你读懂源码
这个介绍文档不侧重讲如何用,官网文档有了,而是通过分析bytebuddy的源码,和官网文档给出一个轮廓,让使用者更好的理解。更多的细节也有一篇源码分析。后面细讲吧。
需要了解更多的细节,可以看我的源码解析,我会尽量完善的。
一、描述
-
基于ASM的代码修改和生成工具
-
runtime期动态生成和修改
-
easy use无需理解字节码,简洁的代码风格
作者写的描述可以看出,最初的目的还是为写agent.jar,但是目标更大,目的是提供一个可以使用简单api来生成和修改类的工具。
二、总览
这张图就是bytebuddy的总体框架
- wave-framework : 多种代理框架或者修改字节码框架的对比
- classLoader: bytebudd使用classLoader的加载策略,wrap ,child-first, injection
- class-wave: 构造新类的方式,redefine,rebase, subclass后面会介绍
- matcher: 运行时判断一个类是不是目标类,这个就是matcher的作用。bytebuddy提供一堆内置的matcher,比如匹配方法异常的MethodExceptionTypeMatcher。
- implementation: 实现,目的是描述字节码如何转化。比如我想为类新加一个方法,使用methodCall,定义一个实现。
三、细节
描述如何使用bytebuddy的api去构造类
3.1 glance 一撇
这是简单使用bytebuddy的一个范式,很好的按照的人的思维去构造一个类
- 我想为
Object.class
构造一个子类,那好就使用subclass
- 子类叫什么呢,使用name(
example.Type
) - 子类想要覆盖
Object.class
的toString方法,我需要做什么呢
a. 定义匹配的规则—matcher,named("toString")
就是生成一个matcher
b. 修改成什么呢—implementation, FixedValue.value
生成一个 FixedValue.value
c.intercept
拼接 - 这个定义好的类,该被什么
classloader
加载呢,这里传入的是当前类的加载器。 - 后续就是生成示例测试了。
3.2 各类类增强工具对比
这个信息来自于bytebuddy自己的说明
性能对比
类的生成策略面临一个权衡,Byte Buddy的主要重点在于以最少的运行时间生成代码。
这是面对类生成,接口实现等行为的不同增强工具的性能对比,总体看起来bytebuddy的性能没有特殊的地方,没有恶化。
到底怎么一个权衡策略,可以看官网,这不是关注的重点
java proxy
Java类库附带一个代理工具包,该工具包允许创建实现一组给定接口的类。这个内置的代理使用很方便,但功能非常有限。比如代理只能面对一个已经存在的接口,
但是对类进行扩展的时候,proxy办不到
cglib
太早了,没人维护了。
该代码生成库是在最初几年的Java实现,它也不幸的是没有与Java平台的发展跟上。尽管如此,cglib仍然是一个功能非常强大的库,但是它的积极开发却变得相当模糊。因此