Class文件结构
-
以一组8字节为基础的二进制流,各个数据项严格按照顺序紧凑排列在Class文件中,中间没有添加任何分隔符,整个Class文件中存储的内容几乎全部都是运行时必要的文书,没有空隙存在
-
当遇到8位字节以上的空间数据项是,则会按照高位在前的方式分割成若干个8位字节进行存储
-
Class文件中有两种数据类型,分别是无符号数(基本数据类型)和表(引用数据类型)
-
魔数
- 开头的四个字节,识别字节码文件的标识(CAFEBABE)
- jdk1.8–>52
- jdk1.7–>51
-
Class文件版本
- 魔数后面为次版本号(5-6个字节)、主版本号 (7-8个字节)从45开始
-
常量池
- 紧接着主版本号
- 字面量
- final值,文本字符串……
- 符号引用
- 类和接口全限名,字段名称、描述符,方法名称描述符
- javap -verbose Hello.class
-
访问标志
- access_flags
- 表示标识符,多个标识符用or连接
-
类索引、父类索引,接口索引集合
- 获取父类,接口信息
-
字段表集合
- 描述接口或类中申明的变量,包括类级变量以及实力级变量。
- 不会列出从父类继承来的字段。
-
方法表集合
- 访问标志,名称索引,描述符索引,属性表集合
-
字段表集合
- 描述方法申明的变量
-
属性表集合
- 描述额外的属性信息
- code属性:经过javac编译后,最终装换为字节码指令存储在code属性内。code属性出现在方法表的属性集合中。
- Excepiton属性:举例列出方法中可能抛出的受查异常,也就是方法描述时在throws关键字后面列举的异常。
- LineNumberTable属性:用于java源码行号与字节码行号之间的对应关系。
- LocalVariableTable属性:描述栈帧表中的变量与java源码中定义的变量之间的关系。
- SourceFile属性:记录生成这个Class文件源码文件名称。
- ConstantValue属性:通知虚拟机自动为静态变量赋值。
- 非static变量:在实例构造器初始化。
- final static :生成ConstantValue属性初始化。
- static :类初始化方向进行。
- InneClass属性:记录内部类与宿主类间的关系。
- Deprecated及Synthetic属性:
- Deprecated表示过时字段,类,方法,由java源码产生
- Synthetic表示一个类、字段或者方法由编译器自动产生。
- StaticMap Table属性:
- 复杂的边长参数,位于Code属性的属性表中。
- 会在虚拟机类加载的字节码验证阶段被新类型检查验证器使用。
- 属性中包含零至多个栈映射帧,每个栈映射帧都是显示或隐式地代表了一个字节码偏移量,用于表示该执行到该字节码时局部变量表和操作数栈的验证类型。
- Signature属性:记录泛型前面信息
- BootstrapMethods属性:保存用于invokedynamic指令引用的引导方法限定符。