bytebuddy简单入门

–> go to 总目录


介绍完了JVM TI和Attach和instrument ,是不是觉得自己可以动手对用户程序魔改了。其实还是很困难,bytebuddy可以帮助你做字节码修改。

作者的文章 了解作者写这个意图
官网入门教程看完后会似懂非懂的模仿用

github源码
byte buddy 源码分析 带你读懂源码

不错的使用指南

这个介绍文档不侧重讲如何用,官网文档有了,而是通过分析bytebuddy的源码,和官网文档给出一个轮廓,让使用者更好的理解。更多的细节也有一篇源码分析。后面细讲吧。
需要了解更多的细节,可以看我的源码解析,我会尽量完善的。

一、描述

  • 基于ASM的代码修改和生成工具

  • runtime期动态生成和修改

  • easy use无需理解字节码,简洁的代码风格

作者写的描述可以看出,最初的目的还是为写agent.jar,但是目标更大,目的是提供一个可以使用简单api来生成和修改类的工具。

二、总览

这张图就是bytebuddy的总体框架

  1. wave-framework : 多种代理框架或者修改字节码框架的对比
  2. classLoader: bytebudd使用classLoader的加载策略,wrap ,child-first, injection
  3. class-wave: 构造新类的方式,redefine,rebase, subclass后面会介绍
  4. matcher: 运行时判断一个类是不是目标类,这个就是matcher的作用。bytebuddy提供一堆内置的matcher,比如匹配方法异常的MethodExceptionTypeMatcher。
  5. implementation: 实现,目的是描述字节码如何转化。比如我想为类新加一个方法,使用methodCall,定义一个实现。

三、细节

描述如何使用bytebuddy的api去构造类

在这里插入图片描述

3.1 glance 一撇

在这里插入图片描述

这是简单使用bytebuddy的一个范式,很好的按照的人的思维去构造一个类

  1. 我想为Object.class 构造一个子类,那好就使用subclass
  2. 子类叫什么呢,使用name(example.Type)
  3. 子类想要覆盖Object.class的toString方法,我需要做什么呢
    a. 定义匹配的规则—matcher,named("toString")就是生成一个matcher
    b. 修改成什么呢—implementation, FixedValue.value生成一个 FixedValue.value
    c. intercept 拼接
  4. 这个定义好的类,该被什么classloader加载呢,这里传入的是当前类的加载器。
  5. 后续就是生成示例测试了。

3.2 各类类增强工具对比

这个信息来自于bytebuddy自己的说明

性能对比
类的生成策略面临一个权衡,Byte Buddy的主要重点在于以最少的运行时间生成代码。

这是面对类生成,接口实现等行为的不同增强工具的性能对比,总体看起来bytebuddy的性能没有特殊的地方,没有恶化。

到底怎么一个权衡策略,可以看官网,这不是关注的重点
在这里插入图片描述
java proxy

Java类库附带一个代理工具包,该工具包允许创建实现一组给定接口的类。这个内置的代理使用很方便,但功能非常有限。比如代理只能面对一个已经存在的接口,

但是对类进行扩展的时候,proxy办不到

cglib

太早了,没人维护了。

该代码生成库是在最初几年的Java实现,它也不幸的是没有与Java平台的发展跟上。尽管如此,cglib仍然是一个功能非常强大的库,但是它的积极开发却变得相当模糊。因此

  • 4
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值