这是我参与8月更文挑战的第27天,活动详情查看:8月更文挑战”
💦Class文件结构
Class文件理解
1. Class文件是什么
-
Java虚拟机不与包括Java语言在内的任何程序语言绑定,它只与“Class文件”这种特定的二进制文件格式所关联。
-
除Java外,如Kotlin、Clojure、Groovy、JRuby、JPython、Scala都可以编译出Class文件。
-
虚拟机丝毫不关心Class的来源是什么语言
-
Class文件中包含了Java虚拟机指令集、符号表以及若干其他辅助信息。
2. Class文件与类的对应关系
- 每一个Class文件都对应着唯一一个类或接口的定义信息,但是相对地,类或接口并不一定都必须定义在文件里(比如或接口也可以通过类加载器直接生成)
3. Class文件格式
-
每个Class文件都由字节流组成,每个字节含有8个二进制位所有16位、32位、64位长度的数据将通过构造成2个、4个和8个连续的8位字节来表示。
-
IDEA工具查看
-
EditPlus工具查看
-
多字节数据项总是按照Big-endian (大端在前)的顺序进行存储
-
Big-endian (大端在前):数据的低位保存在内存的高地址中,而数据的高位保存在内存的低地址中。
-
Little-endian (小端在前):数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中。
-
Class文件可以使用java.io.Datainput、java.io.DataOutpu 等接口和java.io.DatainputStream、java.io.DataOutputStream等类来访问这种格式的数据。
Class文件数据结构
1. Class文件数据结构设计
-
Class文件数据结构采用一种类似于C语言结构体的伪结构来存储数据,这种伪结构中只有两种数据类型:“无符号数”和“表”
-
无符号数
-
定义了一组专用的数据类型来表示Class文件的内容,它们包括u1、u2、u4分别代表1、2和4个字节的无符号数。
-
无符号数可以用来描述数字、索引引用、数量值或者按照UTF-8编码构成字符串值
-
每个无符号数严格按照顺序连续存放,它们之间没有用任何填充或对齐。
-
表
-
表用于描述有层次关系的复合结构的数据。
-
表是由多个无符号数或者其他表作为数据项构成的复合数据类型。
-
表的命名都习惯性地以“_info”结尾。
-
整个Class文件本质上也可以视作是一张表。
-
数据结构描述为数组时,它含有0至多个长度固定的项,可以采数组索引的方式访问