老马的JVM笔记(三)----类文件结构

序:这一节可能过于硬核。虽说可以让人更理解Java,但可能实用性不强。


为了实现平台无关性,将Java应用到各个平台,需要将Java编译成一种各平台都能使用的“程序存储格式”---字节码(ByteCode)。存储形式就是常见的.class文件。各种JVM支持的语言文件都要编译成.class文件才能在JVM上运行。

本节旨在分析.class文件中的内容。

3.1 Class文件结构

.class文件中,字节码以8个字节为基本单位,不需要分隔符,紧凑地排列在一起。所以分割就是8个8个分。文件中为各种“属性”的具体信息,每个属性的长度都不一样,但依然保证每组不超过8字节。

3.1.1 Magic Number

Magic Number用于标识该.class文件是真实能够被JVM接受的文件。防止恶意篡改文件扩展名。.class文件使用的Magic Number为0xCAFEBABE。其他类型的文件也会有自己的Magic Number。紧跟着Magic Number的为该文件使用的JDK版本。

3.1.2 常量池

虽然.class文件中单位为8个字节,但它依然可以存放表,只要长度被定下来。长度被存放在constant_pool_count中,从1开始数。常量池用于存放字面量(literal)(就是声明的变量值,=右边的部分),符号引用(Symbolic References)(类和接口的全限定名,字段的名称和描述符,方法的名称和描述符)。具体而言,每个类型(int,String,Class...)的格式都不同,紧跟的表就会不同。这里没有必要全部列一遍。

3.1.3 访问标志

访问标志(access_flag)跟在常量池后,标识当前类或接口的访问信息。访问信息,就是修饰这个类或接口的一些限定词。Public,final,interface,abstract...

去世了,刚才写了一大堆,在图书馆睡着了,然后电脑自动注销了。以往csdn都会自动保存,偏偏这次没有。本来就不是很重要,不会重写了。

3.2 字节码指令

JVM指令:Opcode+Operands。Opcode长度为1Byte,所以最多只能有2^8=256中Opcode。需要Java省吃俭用地找出这么多精华的操作码。操作码还要自带操作数的类型,所以理论需要很多,但能力又有限。所以load可以有iload(load int型),fload(load float型)等,很多类型会被模糊掉变成int(例如boolean)。

而已有的Opcode的能力其实很多。加载存储(load系列),运算指令(add,sub系列),类型转换,对象创建(new),访问(getfiled),操作数栈管理(pop,dup),控制转移(操作程序控制流,ifeq,goto),方法调用(invoke系列),返回(return系列),异常处理(throw/catch),同步(moniter系列)。

属实可惜。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章