1.class类文件的结构
Class文件是一组以8字节为基础单位的二进制流,中间没有空隙。
Class文件格式采用一种类似于C语言结构体的伪结构来存储,这种伪结构中只有两种数据类型:无符号数和表,后面的解析都是以这两种数据类型为基础。
无符号数属于基本的数据类型,以u1,u2,u4,u8来分别代表1个字节、2个字节、4个字节和8个字节的无符号数,无符号数可以用来描述数字、索引引用、数量值,或者按UTF-8编码构成字符串值。
表是由多个无符号数或其他表作为数据项构成的复合数据类型,所有表都习惯地以“-info”结尾。表用于描述由层次关系地复合结构地数据,整个Class文件本质上就是一张表。
(1) 每个Class文件地头4个字节,魔数 Magic number 。他的唯一作用是用于校验该文件能否被虚拟机接受地Class文件
(2) 4个字节,Class文件的版本号。第5和6个字节是次版本号(Minor Version),第7和8是主版本号(Major Version)。java的版本号是从45开始的
(3) 主次版本号之后的是常量池入口,常量池是Class文件结构中与其他项目关联最多的数据类型,也是占用Class文件空间最大的数据项目之一,同时它还是Class文件中第一个出现的表类型数据项目。
常量池中常量的数量是不固定的,所以在常量池的入口需要放置一项u2类型的数据,代表常量池容量计数值(constant-pool-count)该值从一开始。
0常量空出来是为了满足某些指向常量池的索引值的数据在特定情况下表达“不引用任何一个常量池项目”的意思,这种情况就可以把索引值置为0来表示。Class文件结构中只有常量池的容量计数是从1开始的,对于其他集合类型,包括接口索引集合、字段表集合、方法表集合等的容量计数都与一般习惯相同,是从0开始的。
常量池当中主要存放两大类常量:字面量(Literal)和符号引用(Symbolic References)。字面量比较接近于Java语言层面的常量概念,如文本字符串、被声明为final的常量值等。而符号引用则属于编译原理方面的概念,包括了下面三类常量:
类和接口的全限定名(Fully Qualified Name)
字段的名称和描述符(Descriptor)
方法的名称和描述符
Java代码在进行Javac编译的时候,是在虚拟机加载Class文件的时候进行动态连接。也就是说,在Clas