Java虚拟机之类文件结构
一、简介
众所周知,Java虚拟机最大的特性就是跨平台,但是,Java虚拟机还有另一个重要的特性,就是语言无关性,Java虚拟机支持其它语言通过编译器编译成.class字节码文件,交付给虚拟机运行。
大家都知道Java语言通过javac编译器将Java编译成.class字节码文件,其它语言也是一样的。
Java虚拟机支持语言:Java、Kotlin、Groovy、Jruby、Scala、Jython、Fantom、Clojure、Rhino、Ceylon。
二、Class类文件结构
1. Class文件是什么
Class文件是一组以8个字节为基础单位的二进制流,各个数据项目严格紧凑地排列在文件之中,中间没有添加任何分隔符。当需要8个字节以上空间的数据项,则需要按高位在前的方式分割成若干个8个字节进行存储。
2. 魔数和版本号
Class文件头四个字节就魔数,它唯一的作用是确定Class是否被Java虚拟机接受。不仅Class文件中使用魔数标识身份,其他文件格式也有使用魔数的习惯,如:图片格式GIF和JPG在文件头都有魔数。Class文件的魔数是0xCAFFBABY(咖啡宝贝)。
Class文件头四个字节魔数后面四个字节是版本号,5、6是次要版本,7、8是主要版本。
cafe babe 0000 0034 0042 0a00 1100 2307
Class文件头四个字节是魔数标识:cafe babe。
Class文件5-8字节是版本:0000 0034,使用Class文件34版本。
3. 常量池
在Class文件主次版本号后面紧跟着常量池入口,Class文件结构中常量池和其他项目关联最多的数据,常量池是Class文件第一个表类型的数据项目。常量池的常量数量是不固定的,Class文件版本号后面,用u2字节表示常量池常量数量,如:0042,代表常量池中有42个常量。和Java语言不同,常量池计数是从1开始,而不是0开始。
在常量池中有两大类常量:字面量和符号引用。
其他待补充……