窥一斑而知全豹,几分钟带你读懂Java字节码,再也不怕了

举报
香菜聊游戏 发表于 2021/07/15 01:54:41 2021/07/15
【摘要】 目录 1、如何看字节码 2、一个简单的例子 3、字节码结构 4、总结: 引言:都知道java的源文件最后会被编译成class文件,class文件的内容是字节码。为什么java要编译成字节码呐?我觉得最主要的原因是Java想要做到的跨平台。只要有虚拟机,在任何平台的表现都一样的,屏蔽了系统层的不同,并且不像C,C++ 等语言编译成和平台相关的机器码。同时也给其他...

目录

1、如何看字节码

2、一个简单的例子

3、字节码结构

4、总结:


引言:都知道java的源文件最后会被编译成class文件,class文件的内容是字节码。为什么java要编译成字节码呐?我觉得最主要的原因是Java想要做到的跨平台。只要有虚拟机,在任何平台的表现都一样的,屏蔽了系统层的不同,并且不像C,C++ 等语言编译成和平台相关的机器码。同时也给其他的语言提供了在虚拟机运行的机会,只要是符合规范的class文件,不管是什么语言编译出来的都可以。比如scala,kotlin等等。

1、如何看字节码

原生的字节码看起来实在费劲,让我想起了汇编,记不住太多的指令,有没有什么好的方式能既学习下字节码,也不至于劝退呐。?idea 自带的字节码工具能完美解决这个问题。怎么用呐?

创建Java文件,并且编译后,选中文件后,点view -> Show ByteCode。弹出字节码文件。

2、一个简单的例子

首先看下java源码。一个非常简单的只有一个属性,两个方法的类。

来吧,一起看下字节码这个损色。请快速的扫过,不必深究细节,因为下面我会一行一行的解释。


  
  1. // class version 52.0 (52)
  2. // access flags 0x21
  3. public class org/pdool/d20200923/GamWatcher {
  4. // compiled from: GamWatcher.java
  5. // access flags 0x0
  6. I age
  7. // access flags 0x1
  8. public <init>()V
  9.   L0
  10.   LINENUMBER 6 L0
  11.   ALOAD 0
  12.   INVOKESPECIAL java/lang/Object.<init> ()V
  13.   RETURN
  14.   L1
  15.   LOCALVARIABLE this Lorg/pdool/d20200923/GamWatcher; L0 L1 0
  16.   MAXSTACK = 1
  17.   MAXLOCALS = 1
  18. // access flags 0x1
  19. public getAge()I
  20.   L0
  21.   LINENUMBER 9 L0
  22.   ALOAD 0
  23.   GETFIELD org/pdool/d20200923/GamWatcher.age : I
  24.   IRETURN
  25.   L1
  26.   LOCALVARIABLE this Lorg/pdool/d20200923/GamWatcher; L0 L1 0
  27.   MAXSTACK = 1
  28.   MAXLOCALS = 1
  29. // access flags 0x1
  30. public setAge(I)V
  31.   L0
  32.   LINENUMBER 12 L0
  33.   ALOAD 0
  34.   ILOAD 1
  35.   PUTFIELD org/pdool/d20200923/GamWatcher.age : I
  36.   L1
  37.   LINENUMBER 13 L1
  38.   RETURN
  39.   L2
  40.   LOCALVARIABLE this Lorg/pdool/d20200923/GamWatcher; L0 L2 0
  41.   LOCALVARIABLE age I L0 L2 1
  42.   MAXSTACK = 2
  43.   MAXLOCALS = 2
  44. }

3、字节码结构

可真吓人,独坐敬亭山,相看两讨厌,看不懂啊。下面一起读一下。几乎都注释了,应该看得懂吧。

一个最简单的字节码文件就是这样,看起来似乎不难,所有的单词也都认识,大概猜一下也能理解。既然有概念了,下面就列举一下,对着字节码读一下也就大概懂了。

方法调用指令。

4、总结:关注我公众号【香菜聊游戏】

字节码指令很多,我们也没必要全部都懂,都能记住,只要在需要查看的时候能根据文档读明白,理解其中的含义,知道class的文件结构,毕竟我们是面向开发,不是面向研究,知其然知其所以然够了,不用花太多的精力在上面。加油哦。

写文章不容易,求点赞转发,关注我的公众号【香菜聊游戏】,说不定会有惊喜哦。

文章来源: gamwatcher.blog.csdn.net,作者:香菜聊游戏,版权归原作者所有,如需转载,请联系作者。

原文链接:gamwatcher.blog.csdn.net/article/details/108760186

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。