参考博文:
(2)关于访问标识
(4)附录1 常量池解析
(5)附录2 方法解析
(6)Class文件结构
(8)
1、简介
Java是一门跨平台的语言,可以做到“一次编写,到处运行(Write Once Run Anywhere)。这其中字节码(ByteCode)起到了至关重要的作用。Java虚拟机并没有和任何特定的语言绑定,但是要求运行在虚拟机这上的语言如Java、Scala等按照Java虚拟机规范《The Java Virutal Machine Specification》的要求,生成二进制Class文件格式者可以正常运行到虚拟机之上。例如,Java按照自己的语言规范《The Java Language Specification》将源代码翻译为Class文件格式。
其它的语言也能做到到处运行,但做不到一次编写,例如C语言在Linux平台上与Windows平台上创建线程时有不同的写法:
又或者编写了涉及到基本类型的位操作,C语言在不同平台、不同的操作系统数下其基本类型所占的字节是不同的。而Java无论在任何的平台下,其类型所占用的字节数是平定的,这得益于Java虚拟机为我们屏蔽了硬件差异。这大大简化了Java语言的使用。
2、Class文件头及常量池
2.1 魔术与版本
所有的Class文件开始的4个字节被称为魔术,其值是0xCAFFBABY,主要是起到标识作用。其它许多文件都会规定满足特定格式必须以某几个固定字节开头,如ZIP文件以2字节"PK"(0x504B)开头,因为Jar也是一种压缩文件,同样以"PK"字节开头。如果开始4字节不为0xCAFFBABY,则JVM将会认为该文件不是Class文件而拒绝解析。
魔术之后紧跟着Class文件的次版本号和主版本号。其中第5和第6个字节表示次版本号,第7和第8个字节表示主版本号。
2.2 常量池
3、访问标识与继承
4、字段及方法定义
5、Javac读取class文件
6、Javac生成class文件