上一会讲完了JVM的内存分配和垃圾回收策略我们该讲一讲如何组织一个class文件了
一个class文件怎么被加载运行的?
我们可以说java的野心很大,早在97年的时候JVM虚拟机规范中就说以后可以支持其他语言,到JDK1.7的时候基本已经实现了,怎么做到的呢?
这是JVM做的语言无关性即JAVA/Scala/JRuby等都可以编译成class文件,对于JVM而言我不管你之前什么文件反正我只要class文件就好了:
很明显的,我们这一章就是用来讲解class文件的结构的
这一块比较复杂,我们不做特别详细的讲解,大概了解一下class文件的结构即可
class文件时一组以8字节为基础单位的二进制流,它们中间的数据是按照顺便紧密排列的,也没有用到任何的分隔符,所以规则的理解相当重要。
Class文件格式采用一种类似于C语言的伪结构来存储数据,但是只有两种数据结构,分别是无符号数和表
1、无符号数:
无符号数分别以u1,u2.u4,u8来表示1248个字节,无符号数主要用来描述数字,引用,字符串。
2、表:
表是由无符号数或者其他表作为item的复合的数据结构,这种数据结构是具有层次的(可以类比Java里的list<T>还是带泛形的这种)。于是我们可以说class本身就是一种表,复杂的表,里面包含如下的内容:
虽然画的是烂了点,但是这幅图还是能够表达出一个class的结构,这幅图从左往右,从上往下顺序排列就是class的结构。
在接下来的任务里我们就是一个个的讲解这个大的图。
1、magic魔数
作用:用来确定这个文件是否为一个能被虚拟机接受的Class文件。说白了这个东西的作用跟后缀名.class一样,只是怕你乱改后缀名所以加一个魔数免得你改一个.png成.class去骗他,class文件的魔数为:0xCAFEBABE。
2、minor_version和major_version
作用:确定版本号,minor是次版本号,major是主版本号,Java的版本号从45开始。jdk1.0使用了45.0~45.3之后的每一个版本加一,到jdk1.7的时候版本号是51.0。我截取以前写的类我们来看一看。
我已经给大家划出来了几个部分,怎么样没骗你们吧