字节码文件解析包含3个主要的过程——常量池解析、Java类字段解析、java方法解析。
java文件从被加载到被卸载的整个生命过程,总共需要经历5个阶段:
加载——>链接(验证+准备+解析)——>初始化(使用前的准备)——>使用——>卸载。
加载,简而言之就是将java类的字节码文件加载到机器内存中,并在内存中构件出java类的原型——类模板对象。反射的机制即基于这一基础。字节码相关的工具类库,例如asm、cglib等,都利用了这一机制,在运行期动态修改静态声明的java类所对应的字节码内容,从而在运行期直接改掉java类的定义,甚至直接在运行期创建一个全新的java类。
在链接阶段,着重于由字节码信息出发进行反向验证,例如验证根据字节码文件中的类名是否能够找到对应的类模板。这些都验证无误之后,JVM才能放心地加载当前类,也才能放心的将字节码指令中对常量池索引号的引用重写为直接引用。
反射加载机制
import与new指令
限定类名,就是类名全称,带包路径的用点隔开,例如: java.lang.String。
非限定(non-qualified)类名也叫短名,就是我们平时说的类名,不带包的,例如:String。
非限定类名是相对于限定类名来说的,在Java中有很多类,不同的类之间会存在相同的函数或者方法,所以有时候就需要限定类名来调包。 而如果不存在相同的函数或者方法 ,就可以使用非限定(non-qualified)类名。
至于import进来的类究竟啥时候会被加载,有好几种情况,例如,使用new关键字,或者读写类的静态变量,或者通过反射加载类。
类的初始化
类加载器
类实例分配
即时编译(just-in-time compilation)是一种通过在运行时将字节码翻译为机器码,从而改善字节码编译语言性能的技术。
即时编译器并不是虚拟机必需的部分,Java 虚拟机规范并没有规定 Java 虚拟机内必须要有即时编译器的存在,更没有限定或指导即时编译器应该如何去实现。但是,即时编译器编译性能的好坏、代码优化程度的高低却是衡量一款商用虚拟机优秀与否的最关键的指标之一。它也是虚拟机中最核心且最能体现虚拟机技术水平的部分。