目录
引言:都知道java的源文件最后会被编译成class文件,class文件的内容是字节码。为什么java要编译成字节码呐?我觉得最主要的原因是Java想要做到的跨平台。只要有虚拟机,在任何平台的表现都一样的,屏蔽了系统层的不同,并且不像C,C++ 等语言编译成和平台相关的机器码。同时也给其他的语言提供了在虚拟机运行的机会,只要是符合规范的class文件,不管是什么语言编译出来的都可以。比如scala,kotlin等等。
1、如何看字节码
原生的字节码看起来实在费劲,让我想起了汇编,记不住太多的指令,有没有什么好的方式能既学习下字节码,也不至于劝退呐。?idea 自带的字节码工具能完美解决这个问题。怎么用呐?
创建Java文件,并且编译后,选中文件后,点view -> Show ByteCode。弹出字节码文件。
2、一个简单的例子
首先看下java源码。一个非常简单的只有一个属性,两个方法的类。
来吧,一起看下字节码这个损色。请快速的扫过,不必深究细节,因为下面我会一行一行的解释。
-
-
//
class
version
52.0
(52)
-
//
access
flags
0x21
-
public
class
org/pdool/d20200923/GamWatcher {
-
-
//
compiled from:
GamWatcher.java
-
-
//
access
flags
0x0
-
I
age
-
-
//
access
flags
0x1
-
public
<init>()V
-
L0
-
LINENUMBER
6
L0
-
ALOAD
0
-
INVOKESPECIAL
java/lang/Object.<init>
()V
-
RETURN
-
L1
-
LOCALVARIABLE
this
Lorg/pdool/d20200923/GamWatcher;
L0
L1
0
-
MAXSTACK
=
1
-
MAXLOCALS
=
1
-
-
//
access
flags
0x1
-
public
getAge()I
-
L0
-
LINENUMBER
9
L0
-
ALOAD
0
-
GETFIELD org/pdool/d20200923/GamWatcher.age :
I
-
IRETURN
-
L1
-
LOCALVARIABLE
this
Lorg/pdool/d20200923/GamWatcher;
L0
L1
0
-
MAXSTACK
=
1
-
MAXLOCALS
=
1
-
-
//
access
flags
0x1
-
public
setAge(I)V
-
L0
-
LINENUMBER
12
L0
-
ALOAD
0
-
ILOAD
1
-
PUTFIELD org/pdool/d20200923/GamWatcher.age :
I
-
L1
-
LINENUMBER
13
L1
-
RETURN
-
L2
-
LOCALVARIABLE
this
Lorg/pdool/d20200923/GamWatcher;
L0
L2
0
-
LOCALVARIABLE
age
I
L0
L2
1
-
MAXSTACK
=
2
-
MAXLOCALS
=
2
-
}
3、字节码结构
可真吓人,独坐敬亭山,相看两讨厌,看不懂啊。下面一起读一下。几乎都注释了,应该看得懂吧。
一个最简单的字节码文件就是这样,看起来似乎不难,所有的单词也都认识,大概猜一下也能理解。既然有概念了,下面就列举一下,对着字节码读一下也就大概懂了。
方法调用指令。
4、总结:关注我公众号【香菜聊游戏】
字节码指令很多,我们也没必要全部都懂,都能记住,只要在需要查看的时候能根据文档读明白,理解其中的含义,知道class的文件结构,毕竟我们是面向开发,不是面向研究,知其然知其所以然够了,不用花太多的精力在上面。加油哦。
写文章不容易,求点赞转发,关注我的公众号【香菜聊游戏】,说不定会有惊喜哦。
转载:https://blog.csdn.net/perfect2011/article/details/108760186