1、文件结构
1.1 例图:

1.2 结构图形

符号 |
中文名 |
结构 |
做用 |
规则 |
magic |
魔数 |
U4 |
全部的由Java编译器编译而成的class文件的前4个字节都是 “0xCAFEBABE” ,JVM用来判断是不是可加载的.class文件 |
|
minor_version |
次版本号 |
u2 |
JVM |
|
major_version |
主版本号 |
u2 |
JVM加载class文件的时候,判断是否可加载,若是JDK.Mj_Version<Class.Mj_Version,则认为加载不了。须要从新编译 |
JDK1.0->45;1.7->51 |
constant_pool_count |
常量池中常量数量 |
u2 |
记录了constatn_pool中constant_pool_info的数量 |
index从1开始;index=0:某些指向常量池的索引值的数据在特定的状况下表达“不引用任何一个常量池项”。 |
constatn_pool |
常量池数据区 |
constant_pool_info结构 |
包含Class文件结构及其子结构中引用的全部 字符串常量、类、接口、字段名和其它常量(字面量和符号引用) |
tag bytes:第一个字节,用于识别哪一种类型的常量。index=constant_pool_count - 1。 |
access_flags |
访问标志 |
u2 |
表示某个类或者接口的访问权限及基础属性 |
|
this_class |
类索引 |
u2 |
this_class的值必须是对constant_pool表中项目的一个有效索引值。constant_pool表在这个索引处的项必须为CONSTANT_Class_info 类型常量,表示这个 Class 文件所定义的类或接口 |
|
super_class |
父类索引 |
u2 |
super_class的值必须是对constant_pool表中项目的一个有效索引值。constant_pool表在这个索引处的项必须为CONSTANT_Class_info 类型常量,表示这个 Class 文件所定义的直接父类 |
|
interfaces_count |
接口计数器 |
u2 |
当前类或接口的直接父类接口数 |
|
interfaces |
接口信息数据区(接口表) |
u2 |
interfaces[]数组中的每一个成员的值必须是一个对constant_pool表中项目的一个有效索引值, 它的长度为 interfaces_count |
|
fields_count |
字段计数区 |
u2 |
fields_count的值表示当前Class文件 fields[] 数组的成员个数 |
|
fields |
字段信息数据区(字段表) |
field_info结构 |
fields[]数组中的每一个成员都必须是一个fields_info结构 的数据项,用于表示当前类或接口中某个字段的完整描述,但不包括从父类或父接口继承的部分 |
|
methods_count |
方法计数器 |
u2 |
methods_count的值表示当前Class 文件 methods[]数组的成员个数 |
|
methods |
方法信息数据区(方法表) |
method_info 结构 |
methods[] 数组中的每一个成员都必须是一个 method_info 结构 的数据项,用于表示当前类或接口中某个方法的完整描述 |
|
attributions_count |
属性计数器 |
u2 |
attributes_count的值表示当前 Class 文件attributes表的成员个数 |
|
attributions |
属性信息数据区(属性表) |
attribute_info结构 |
attributes 表的每一个项的值必须是attribute_info结构 |
在Java 7 规范里,Class文件结构中的attributes表的项包括下列定义的属性InnerClasses 、 EnclosingMethod 、 Synthetic 、Signature、SourceFile,SourceDebugExtension 、Deprecated、RuntimeVisibleAnnotations 、RuntimeInvisibleAnnotations以及BootstrapMethods属性。 |
- u四、u二、u1:表示几个字节
- cp_info(Constant_pool_info):常量池中,字符表的数据结构
- field_info:字段表中数据结构
- method_info:方法表中的数据结构
- attribute_info:属性表中的数据结构
1.3 class文件:access_flags:

2、class文件常量池
2.1 常量池总结
- 全部 符号(变量、方法、类) 都是经过cp_info结构来表示
- 同一文件的全部符号(变量、方法、类) 的相同值都会指向同一地址
- 对全部的基本类型(int、float、long、double) 都是 字面类型+bytes表示
- 对全部引用类型(String,class),都会用单独的 Constant_utf8_info 构造,而后在经过 Constant_String_info, constant_Class_info 指针只过去
- 每一个个类而言,其class文件中至少要有两个CONSTANT_Class_info常量池项,用来表示本身的类信息和其父类(Object)信息
2.2 class文件的常量池结构

2.3 class文件常量池中数据结构

2.4 cp_info的字面量

2.5 cp_info表示信息

2.6 各种型案例




public class StringTest {
private String s1 = "JVM原理";
private String s2 = "JVM原理";
private String s3 = "JVM原理";
private String s4 = "JVM原理";
}

package com.jvm;
import java.util.Date;
public class ClassTest {
private Date date =new Date();
}
