前言
Java的跨平台
- Java的跨平台是因为它有JVM,以及Java代码会被编译成.class文件,即字节码文件。
- 字节码文件在不同平台都可以通过JVM去执行它。
- 值得一提的是,JVM并不是跨平台的,不同的平台有它不同的实现特点。
- JVM可以看得懂字节码文件,但人是看不懂的,因为它是二进制文件。
- 但是,JVM有规定字节码文件的规范,根据这个规范,其它语言只要能编译成JVM所规范的字节码文件,它就可以在JVM上运行。比如,Kotlin、Scala。。。
- 之所以要学习它的字节码,是为了更好的理解Java代码的更深层次的意义,以及代码运行的机制,比如加深和理解Volatile关键字中的防止指令重排序、内存可见性的原因等等。
初识字节码文件
首先.class是字节码文件
- .class文件并不是大伙儿用IDEA打开的那样,那其实是IDEA反编译的。
- Java代码都要编译成.class文件,JVM才能运行它。
.class内容
- 先来一段Java代码,编译一下。
public class StartByteCode { private int anInt; public int getAnInt() { return anInt; } public void setAnInt(int anInt) { this.anInt = anInt; } } - 其字节码,如下:
之所以叫字节码,是因为它是以两个16进制数为单位,一个16进制由4位二进制表示,因为二进制1111表示f,两个16进制数用8位表示,即一个字节。
- 上面的字节码右侧有些前面写的java代码,那是插件根据ACII码勉为其难的翻译出来的,但是并不是所有的字节都ACII码对应,所以就显得很乱。
- 再看开头的前4个字节,称之为魔数(Magic Number),是来标识这个是一个合法且有效的字节码文件。,如果不是CA FE BA BE,JVM就不会读取并执行它。
其实Java自带反编译的命令
-
javap -verbose xxx.class- 使用javap -verbose命令分析一个字节码文件时,将会分析该字节码文件的魔数、版本号、常量池、类信息、类的构造方法、类中的方法信息、类变量与成员变量等信息。
- 魔数︰所有的.class字节码文件的前4个字节都是魔数,魔数值为固定值: 0xCAFEBABE。
解读一下字节码
- 上面提到,前4个字节是魔数。
- 。。。
- 下一篇,