1.虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。
2.类的加载、连接、初始化都是在程序运行期间完成的。
3.类的生命周期包括:加载-->连接(验证,准备,解析)-->初始化--->使用---->卸载
4.加载、验证、准备、初始化和卸载这5个阶段的顺序是确定的,类的加载过程必须按照这种顺序按部就班的开始,但是解析阶段不一定,它在某些情况下可以在初始化阶段之后再开始。这是为了支持Java语言的运行时绑定。
5.对于类加载,JVM没有明确约束触发时间,但是对于初始化,在以下几种情况下必须立即进行(而加载、验证、准备自然需要在此之前开始)。
(1)遇到new、getstatic、putstatic或者invoke这4条字节码指令。(new实例化对象、get/set一个类的静态字段[被final修饰、已在编译期把结果放入常量池的静态字段除外],以及调用一个类的静态方法)
(2) 使用java.lang.reflect包的方法对类进行反射调用时,如果类没有进行过初始化,则需要先进行初始化。
(3) 当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要先触发其父类的初始化。
(4) 当虚拟机启动的时候,用户需要制定一个执行的主类。
(5) 见书上
以上5种场景被称为主动引用,其他的引用方式被称为被动引用。不会触发初始化。
6.被动引用举例: