一、类文件结构
1、class类文件结构
1)魔数与Class文件的版本
2)常量池
3)类或接口层次的访问标志
4)类索引、父类索引、接口索引集合,通过这三项数据来确定这个类的继承关系
5)字段表,包括类级变量、实例级变量,是不包括方法内部声明的局部变量的,不会列出从父类或父接口中继承的字段
6)方法表,方法体的代码经过Javac编译器处理后,最终变为字节码指令存储在Code属性内
7)属性表
2、字节码指令有哪些
3、栈帧
每一个方法从调用开始到执行完成,都对应着一个栈帧在虚拟机栈里面从入栈到出栈的过程。
每一个栈帧都包括了局部变量表,操作数栈,动态连接,方法返回地址。
Java编译器输出的指令流,是一种基于操作数栈的指令集架构。
4、方法调用
JAVA虚拟机里面提供了5条方法调用的字节码指令。
解析:在编译器进行编译时就有一个可确定的调用版本,在类加载的解析阶段就会将符号引用转化为直接引用。
分派:依赖变量的静态类型来定位方法执行版本的分派动作称为静态分派,在运行期根据实际类型确定方法执行版本的分派过程称为动态分派。
二、类加载
1、类加载过程
加载、验证、准备、解析、初始化
2、类加载器
双亲委派模型