序言
为什么写这本书
笔者在学习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系统中的字节码插桩。
第八章补充一些知识点,如类型检查与栈映射桢、泛型以及泛型方法的调用。在掌握前面几章的知识点后,这些内容将不难理解。
●OpenJDK Github源码下载地址(不同版本对应不同分支):https://github.com/unofficial-openjdk/openjdk/tree/jdk8u/jdk8u。
●本书中的案例代码下载地址:https://github.com/wujiuye/bytecode-book
本书Class文件结构参考《Java虚拟机规范》Java SE 8版[1]。
勘误与支持
由于作者水平有限,书中难免存在一些错误或是表述不准确的地方,恳请读者批评指正。如有问题,可发送邮件到419611821@qq.com,或到https://github.com/wujiuye/bytecode-book提交Issue。书中的全部源码文件可在https://github.com/wujiuye/bytecode-book下载。期待能够得到您的真挚反馈。
致谢
首先我要感谢我的女朋友,感谢你的陪伴和鼓励,是你让我能够在写作本书期间可以“两耳不闻窗外事”,专注写作。
感谢我的朋友范明毅和他的女朋友,感谢他们为本书设计封面。
感谢我的朋友郭伟强,感谢他一直激励我完成本书的写作,也经常与我谈论本书。
感谢我的主管王恒,他在工作和生活上给予我很多的帮助和支持,也一直关注本书的写作与出版进度。
此书能够顺利出版还要感谢BookDNA的工作人员,感谢你们花费大量时间和精力阅读、审校我的文稿,帮助我完成此书的出版!
谨以此书献给我的爸妈,希望他们身体健康,以及一直以来鼓励我的公众号读者、身边的同事、朋友,希望你们工作开心、生活幸福!
注释:
[1] 《Java虚拟机规范》是Java领域最重要和最权威的著作之一,Java SE 8版完整且详细的讲解基于Java SE 8的Java虚拟机规范。