Java 类文件结构
Posted xiao-ji-xiang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 类文件结构相关的知识,希望对你有一定的参考价值。
Class类文件时一组以单字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑的排列在Class文件中,没有任何分隔符。对于大于8位的数据均采用大头方式储存,文件中只有无符号数和表两种结构
无符号数有u1,u2,u4,u8,即1,2,4,8位字节,可以用来描述数字,索引引用,数量值或按照utf8编码的字符串值
表是由一组无符号数组成的结构,所有表均以_info结尾,整个Class文件本质上就是一张表,其按照以下数据项依次排列:
magic-->minor_version-->major_version-->constant_pool_count-->constant_pool-->access_flags-->this_class
-->super_class-->interfaces_count-->interfaces-->fields_count-->fields-->methods_count-->methods-->attributes_count-->attributes
1.magic u4
魔数,Class文件以0xCAFEBABE开头
2.minor_version u2 major_version u2
次版本号和主版本号 jdk1.8的主版本号位52
3.constant_pool_count u2 constant_pool
常量池,constant_pool_count代表常量池计数器,从1开始计数,所以常量池中常量个数等于constant_pool_count - 1,用0来表示“不引用任何常量池项目”
常量池主要存放字面量(Literal)和符号引用
字面量:字符串,被声明为final的值等
符号引用:包含以下三类常量
1)类和接口的全限定名
2)字段的名称和描述符
3)方法的名称和描述符
常量池中每一项都是一个表,一共有11中结构不同的数据表,以下是每个表所对应的标志(tag)
标志 | 类型(CONSTANT_xxx_info) | 描述 | 结构(第一个字节均为对应的tag) |
1 | Utf8 | UTF-8编码的字符串 | length(u2) + bytes(length) |
3 | Integer | 整型字面量 | bytes(ur) |
4 | Float | 浮点型字面量 | bytes(u4) |
5 | Long | 长整型字面量 | bytes(u8) |
6 | Double | 双精度浮点型字面量 | bytes(u8) |
7 | Class | 类或接口的符号引用 | index(u2) |
8 | String | 字符串类型字面量 | index(u2) |
9 | Fieldref | 字段的符号引用 | index(u2) + index(u2) |
10 | Methodref | 类中方法的符号引用 | index(u2) + index(u2) |
11 | InterfaceMethodref | 接口中的符号引用 | index(u2) + index(u2) |
12 | NameAndType | 字段或方法的部分符号引用 | index(u2) + index(u2) |
4.access_flags
5.this_class super_class
6.interfaces_count interfaces
7.fields_count fields
8.methods_count methods
9.attributes_count attributes
以上是关于Java 类文件结构的主要内容,如果未能解决你的问题,请参考以下文章