目录
字节码
Java字节码和二进制文件
字节码文件、反编译和解析
机器码
字节码
Java字节码和二进制文件
Java字节码文件(.class):对Java源文件(.java)编译后生成的二进制文件。二进制文件不单单包含只由0、1二进制组成的文件,还包括四、八、十六进职等。Java字节码文件是十六进制的二进制文件。
字节码文件、反编译和解析
对字节码文件反编译后会生成类似Java源文件(.java)的代码,idea自带反编译功能,所以点击class文件可以直接阅读。
真正的class文件如下
使用Binary Viewer可以打开
起始内容为CafeBaby,称之为魔术(magicnumber),所有能被jvm识别的字节码文件都必须使用CafeBaby作为起始内容。
javap命令:大多数人认为javap是反编译,其实是一种对字节码的解析。参考oracle的官方说明
意思是说对class文件进行反汇编。
三种方式解析字节码:
控制台输入javap -v ***.class
安装jclasslib bytecode viewer
idea安装jclasslib bytecode插件
解析结果如下
这个文件与上述反编译文件的不同在于,它详细解释了jvm对代码的执行流程,例如何时从内存读出数据,何时把新方法压入栈。而反编译的类java文件还是从逻辑角度出发,是你编写代码时的逻辑顺序(即原始java文件)。
机器码
CPU机器码
只有CPU能够读懂的一组0、1二进制数,jvm对字节码转译后才会变成机器码,java的跨平台性就体现在不依赖CPU等具体硬件,一切底层依赖交给jvm处理。