最近呢,给自己定了些小目标(其实就是列了下近期想要学习的东西一些列表)
其中一个,就是java的字节码的解析。
说是解析,其实就是研究研究字节码,并且能看懂一些简单的字节码文件。
前言:
我觉得作为一个java工程师(虽然我领导说我java很菜,算不上写java的),还是要对字节码有所了解的,这样更能够加深自己对java的理解,对代码运行过程的理解,甚至有一些奇奇怪怪的面试题(就写了一段代码,问你会return或者打印什么值)通过字节码也可以解释的通,不然很多题目都是通过结果来推过程(尽管反推也是一种可行的方法,但如果能提前知道过程和原因,推测结果,然后运行程序,发现预测的一样,不就更有成就感,也能提升自己的水平!!)
(我觉得)学习的顺序:
1、一些简单的概念,例如什么是字节码,如何查看,java为什么能在各种环境下运行等基础问题
2、字节码指令(通过javap得到的字节码的相关指令)
3、类的字节码中有哪些模块
4、了解每个模块中的信息,看懂较为基础的代码编译出来的字节码
5、研究一些比较特殊的语法糖的实现(包括java,scala等需要编译成class文件的语言)
但是其实,关于字节码的相关资料真的挺多的,这篇文章我犹豫了很久才写,毕竟偏理论性的文章,写出来会和其他文章如出一辙。所以最后决定文章的大纲由我自己拟定,接着会引用他人的文章的部分,来组成该博客(我会标明作者的!!)
正文:
我们写好的以java为后缀的文件,可以通过javac这个命令来编译成class文件,class文件可以通过反编译工具变回代码(不过并不会变成一模一样的代码,会和原来的有所区别,但是功能肯定是一样的),也可以通过javap的命令来获得字节码信息。嗯~到这里,简单的概念我就不啰嗦了,大家百度都能百度到啊!!
1、如果想对java的JVM模型深入了解:
https://dzone.com/articles/introduction-to-java-bytecode(作者:Mahmoud Anouti)
如果要让我概括个大概的话,就是当你要操作一个加法的时候,需要将数字A加载到操作数堆栈(英文原文为:operand stack),然后把数字B也加载到操作数堆栈,将操作数堆栈中的两个值pop(弹出),进行相加,把结果push回操作数堆栈,最后pop出刚才的结果值,存到本地变量中(建议大家直接看英文原文,因为各个翻译版本不尽相同,容易引起误会)
2、字节码命令
JVM Class详解之二 Method字节码指令:
https://yq.aliyun.com/articles/7242?spm=a2c4e.11155435.0.0.790d367cULERDq(作者:nothingismao)
该文已经写的非常详细,并且分类,条理清晰,主要需要记住哪些指令是把数值加入到操作数堆栈,哪些是弹出的(哪些是入栈哪些是出栈的)!其他的一些逻辑判断,主要是看有没有行数的跳转!
如图(行数跳转):
3、类的字节码中包含的模块
讲道理,我根本记不全,因为有些模块其实不影响我们对字节码执行顺序的解读,这部分推荐大家将自己的代码反编译一下,做一个大概的了解即可,如下两篇文章有些内容可能会重复,重复的跳着看就好~
https://yq.aliyun.com/articles/7241?spm=a2c4e.11155435.0.0.790d367cx67aXN(作者:nothingismao)
https://www.jianshu.com/p/247e2475fc3a(作者:Windy_816)
4、提升:
如果你想要有更多字节码的案例,以下的文章可以满足你!
有一位国外的大神有开这个坑(但是他坑还没填完):
http://blog.jamesdbloom.com/JavaCodeToByteCode_PartOne.html(作者:James Bloom)
http://blog.jamesdbloom.com/JavaCodeToByteCode_PartTwo.html(作者:James Bloom)
建议最好看原文,当然也有csdn上也有翻译的版本,也可以参考着看,他的其他文章也都很不错~!有空可以多看看其他的