3.1 字节码文件里是什么?

源代码经过编译器编译之后便会生成一个字节码文件,字节码是一种二进制的类文件,它的内容是JVM的指令,而不像C、C++经由编译器直接生成机器码,这也是C、C++高效的原因。

3.2 什么是字节码指令(byte code)?

Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的操作码(opcode)以及跟随其后的零至多个代表此操作所需参数的操作数( operand)所构成。虚拟机中许多指令并不包含操作数,只有一个操作码。
例如:操作码(操作数),aload_0就是操作码,aload是有现成的操作码,一般是aload_0到aload_4表示,如果操作这个范围,就会以操作码+操作数的表示,比如:aload 6的形式表示,为什么这样做呢?是因为aload_0到aload_4是比较常用的,为了节省字节码文件的空间。
image.png

3.3 如何解读供虚拟机解释执行的二进制字节码?

  • 方式一:一个一个二进制的看。这里用到的是Notepad++,需要安装一个HEX-Editor插件,或者使用Binary Viewer

image.png

  • 方式二:使用javap指令:jdk自带的反解析工具

javap指令查看字节码:例如:javap -v IntegerTest.class 或者 javap -v IntegerTest.class > IntegerTest.txt可以将解析后的字节码放入指定的文件中

  • 方式三:使用IDEA插件:jclasslib 或jclasslib bytecode viewer客户端工具。(可视化更好)

image.png