/bytecode-book

《Java虚拟机字节码从入门到实战》一书的配套代码

Primary LanguageJava

《Java虚拟机字节码从入门到实战》-吴就业

作者简介

吴就业,Java开发工程师、架构师,在微服务领域有丰富的实战经验,曾负责过广告系统重构的分布式架构设计、支付中心的技术选型与架构设计、基于XXL-JOB二次开发的分布式定时任务调度平台、自研微服务监控系统等。喜欢研究优秀的开源框架源码,擅长Spring Cloud、Dubbo、Netty、Java虚拟机字节码等技术,对Java虚拟机有过深入的学习。

内容简介

这是一本Java虚拟机字节码入门书籍,全书共分为8个章节。第一章介绍Java虚拟机栈、栈帧以及局部变量表和操作数栈,这些是理解Java虚拟机字节码执行过程的必备基础知识;第二章通过使用Java代码结合设计模式实现一个解析class文件结构的工具分析Java代码编译后生成的class文件的结构;与学习一门语言一样,第三章介绍底层字节码是如何实现各种条件分支语句、循环语句,以及try-catch代码块的,在分析每个例子的每条字节码指令的执行过程中介绍字节码指令;第四章分析类加载过程,分析HotSpot虚拟机类加载源码,重点介绍字节码验证阶段,各种VerifyError就是这个阶段抛出的;第五章通过使用访问者模式实现一个简单的class字节码操作框架介绍ASM框架的实现原理,理解和使用ASM的API;第六、第七章是实战篇,第六章介绍如何使用动态字节码技术实现JDK动态代理、Cglib动态代理;第七章介绍如何使用Java Instrumentation和动态字节码技术实现APM监控系统的字节码插桩;第八章分析类型检查与栈映射桢、泛型以及泛型方法的调用。

前言

为什么写这本书

笔者在学习Java虚拟机字节码的过程中遇到过很多问题,也曾浪费不少时间去查阅资料,在学习ASM框架时,更是苦于找不到系统且详细的介绍ASM框架如何使用的资料,而选择自己看API文档摸索,学习过程中遇到的一些问题都需要花费大量时间去解决。例如,使用IDEA查看字节码反编译后的Java代码看似没问题,但总能遇到各种VerifyError。

在本书开始写作时,市面上还没有一本适合新手入门Java虚拟机字节码的书籍,从网上找的资料也是零零散散,笔者之前也写过一些关于Java虚拟机字节码方面的文章,看到很多读者留言:希望作者能写一篇介绍ASM框架的使用,网上找不到合适的资料,看英文API文档又看不懂、希望作者能详细介绍一下字节码指令的执行过程等。

因此,笔者下定决心一定要完成这本书。本书将归纳以及提炼知识点,为读者制定合理的学习路线,帮助读者更快的掌握Java虚拟机字节码技术,了解字节码背后的执行原理,以及帮助读者快速入门使用ASM框架操作字节码。

读者对象

  • Java开发工程师;
  • Java虚拟机字节码发烧友;
  • 想了解动态代理背后的实现原理的读者;
  • 想了解字节码插桩实现原理的读者;

如何阅读本书

如果您购买的是电子书,可能使用移动设备看书中的代码显示得不够直观,建议使用大屏幕设备阅读,例如平板、电脑。

阅读本书之前,您必须有一定的Java基础。建议按照顺序阅读本书,并动手实现一遍书中的例子。本书一共8章,以下是各章的基本介绍。

第一章介绍Java虚拟机栈。了解虚拟机栈、栈帧、局部变量表、操作数栈是理解字节码指令的基础,除此之外,学习本章还能了解到为什么调优-Xss参数能节省内存、为什么代码运行会出现StackOverflowError错误。

第二章通过使用Java代码结合设计模式实现一个解析class文件结构的工具分析Java代码编译后生成的class文件的结构;

第三章开始介绍字节码指令,与学习一门语言一样,学习底层字节码是如何实现各种条件分支语句、循环语句,以及try-catch代码块的。透过字节码了解try-catch-finally是怎么实现的,以及try-with-resource语法糖是怎么实现的。最后分析四条常用的方法调用指令在使用上的区别。

第四章简析类的加载过程,了解什么是双亲委派模型,目的是要自己实现一个类加载器来加载自己动态生成或改写类的字节码。本章也分析HotSpot虚拟机类加载部分源码,重点介绍字节码验证阶段,各种VerifyError就是这个阶段抛出的。

第五章介绍ASM框架的使用,介绍Javassist与ASM的不同点与各自的优缺点。通过使用访问者模式实现一个简单的class字节码操作框架介绍ASM框架的实现原理,帮助读者更好的理解ASM的API。通过使用ASM操作字节码实现创建类和方法、改写类和方法、实现接口、继承父类覆写方法等,熟悉ASM框架的API。

第六章、第七章,通过实战掌握前面所学的知识点,学以致用。所选案例都是常见的动态字节码技术的使用场景。如实现两种不同方式的动态代理、实现APM系统数据采集的核心实现字节码插桩。

第八章补充一些知识点,如类型检查与栈映射桢、泛型以及泛型方法的调用。在掌握前面几章的知识点后,这些内容将不难理解。

勘误与支持

由于作者水平有限,书中难免存在一些错误或是表述不准确的地方,恳请读者批评指正。如有问题,可发送邮件到wujiuye99@gmail.com,或到https://github.com/wujiuye/bytecode-book提交Issues。书中的全部源码文件可在https://github.com/wujiuye/bytecode-book下载。期待能够得到您的真挚反馈。