【java】对字节码的理解和整理

最近呢,给自己定了些小目标(其实就是列了下近期想要学习的东西一些列表)

其中一个,就是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上也有翻译的版本,也可以参考着看,他的其他文章也都很不错~!有空可以多看看其他的

 

如果本文链接的这些文章,都仔细看过了,那么会对字节码有一个比较清晰的理解,接下来就需要自己去反编译一些自己以前写过的代码,甚至去研究一些语法糖如何实现的,相信你会有更深刻的体会~

 

好了菜鸡一只,如果有哪里说错了欢迎留言~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值