class文件的结构
2017-03-12 16:07:53 0 举报
Java class文件是Java虚拟机执行的基础,它包含了Java程序的字节码。一个典型的class文件结构如下: 首先是一个魔数(Magic Number),用于识别这个文件是一个class文件。接着是版本号,表示这个class文件使用的版本。然后是常量池,它是一系列常量的集合,如类名、方法名、字段名等。紧接着是访问标志和当前类索引、父类索引,用于确定类和继承关系。再之后是类索引、接口索引数组,用于确定类的实现接口。接下来是字段表、方法表、属性表,它们分别存储了类的成员变量、成员方法和附加信息。最后是字符串表和字节码指令,字符串表存储了类的字符常量,字节码指令则是JVM执行的操作。
作者其他创作
大纲/内容
附加信息
java.lang.Class对象
分配
数组:前置[,每个[代表一个维度
启动时加载main方法所在类
父类索引
指向
加载路径:JAVA_HOME/lib
正确
卸载
引导方法索引
校验是否符合class文件规范,相当于词法分析+语法分析
CONSTANT_(IFLD)_info
父接口
启动类加载器
接口
类方法的解析
属性池
获取全限定名
invokespecial
推断运行过程中数据流河控制流是否规范合法
类的全限定名
tag
基础类型:使用标示字符代替
接口集合
名称和类型描述符
判断其类型
InnerClasses
UTF-8编码字符串
检查是否存在对应的java.lang.Class对象
局部变量表
Class
字段集合
load
当且仅当这五种情况时加载类
将CONSTANT_Methodref_info中类描述符替换为VirtualMethodTable表中的行号,名称和类型描述符替换为偏移量
invokeinterface
本身
抛出异常
操作数栈
方法集合
类描述符
获取类的全限定名Lcom.C
invokedynamic
魔数
当前类加载器是否有父类且父类未尝试加载过?
堆
新生代
访问标志+简单名称+描述符+属性池
放大
是否存在对应的Class对象?
方法描述符
S1区
invokestatic
字段的解析
将CONSTANT_Class_info替换为指向Class对象的引用
遍历类中的各个符号引用
D
次版本号
对象头
类元数据
请求
操作数栈管理指令
虚方法的引用
非虚方法
字符串值
根据Class对象在Eden区分配一个实例c,并将其类型指针指向方法区中的Class对象
句柄类型
方法调用和返回指令
虚方法
实例数据c
集合类型
老年代
C的类元数据
栈帧b
主版本号
无
文件格式验证
ConstantValue
length
存在
CONSTANT_NameAndType_info
准备
(参数列表)返回值
是
在方法区中分配C的常量和静态量
CONSTANT_Fieldref_info
应用程序类加载器
this指针
wide
是否成功?
控制转移指令
CONSTANT_String_info
什么都不做,等运行时再解析
接口方法
CONSTANT_InvokeDynamic_info
解析
virtual method table
字节码验证
static变量
静态多分派
Exceptions
使用反射调用类时发现尚未初始化
名称
加载路径:JAVA_HOME/ext
字面量
版本号(主/次)
属性表
CONSTANT_Class_info
静态方法
初始化
请求类加载器根据全限定名加载之
不存在
元数据验证
code
验证符号引用的存在和可访问性
CONSTANT_InterfaceMethodref_info
mark world
找不到
字段描述符
类变量的引用
结束
子类加载时发现父类未加载
类索引
虚拟机栈
对象创建和访问指令
不正确
SourceFile
验证
操作类的常量池
常量池
静态分派
连接
CONSTANT_Methodref_info
return
父类方法
扩展类加载器
S2区
基础类型常量
栈帧a
访问标志
CONSTANT_MethodHandle_info
。。。。。
编译
LocalVariableTable
基础类型值
类型转换指令
加载
执行过程中遇到new指令
符号引用验证
。。。。
方法句柄
搜索顺序
常量集合
普通无符号数类型
引用类型
final修饰的方法
将CONSTANT_Fieldref_info替换为字面量
开始
版本号
C中静态量
运行时常量池
对象:L+全限定名
转化为java存储结构,即类元数据,存储在方法区中
StackMapTable
获取当前类加载器
计算指令
设置其父类为当前类加载器
将CONSTANT_Fieldref_info替换为指向static量的引用
适用于编译时可唯一确定所调用方法
CONSTANT_Utf8_info
动态分派
加载和存储指令
加载成功
Signture
方法区(永久代)
描述符
class文件
私有方法
全限定名(类/接口)
BoostrapMethods
类型指针
获取数据
父类
校验class中语义是否正确,相当于语义分析
否
同步指令
class文件的结构
实例变量的引用
验证数据流河控制流的合法行
调用方法命令
CONSTANT_MethodType_info
Eden区
LineNumberTable
加载路径:classpath
在局部变量表中新分配一个slot存放实例c的引用
字符串
符号引用
如果是常量,那么获取该字段属性表中ConstantValue的值,并初始化
方法调用
C
Deprecated、Synthetic
类、接口的解析
类的引用
自定义类加载器
尝试加载
C中常量
x2x
分派
动态单分派
invokevirtual
常量的引用
共享部分
将CONSTANT_Fieldref_info中类描述符替换为Class对象引用,名称和类型描述符替换为偏移量
非虚方法的引用
退回上个类加载器
编译期间通过类的静态类型和调用参数确定
store
分配一个Class对象作为类元数据的入口
读取文件
构造器方法
返回验证结果
类实例c
接口方法的解析
异常指令(athrow)
运行期间通过类的实际类型确定
属性
获取
c的引用
非数组
java文件
字节流
使用
0 条评论
下一页