虚拟机类加载机制
1.介绍
虚拟机将描述类的数据class文件从本地加载到内存,并对数据进行校验、转换、解析和初始化,最终形成可以被虚拟机使用的java类型,这就是虚拟机的类加载机制。这个过程均是在运行时期完成的。其中,每个class文件可能对应系统中的类或接口;
类的加载时机:类从被虚拟机加载到内存开始,到卸载为止,整个生命周期经历加载,校验,准备,解析,初始化,使用和卸载等7个时期。其中校验,准备,解析统称为链接时期,下面主要介绍需要了解的重要特性之一-初始化的5钟情况(假设存在一个TestInit类,如果想显示看到初始化过程,可以在类中添加一个static块,如static{System.print.out(“init start…”)}):
1. 如果类没有进行初始化,则遇到程序中执行new、读取或设置静态字段、调用静态方法时等会进行初始化操作。
如:new TestInit();或者TestInit.printStr();或者TestInit.NAME_DEFAULT;
2. 使用java.lang.refect包对类进行反射操作的时候,如果类还没有初始化过,则进行初始化操作。
如:TestInit.class;
3.当初始化一个类的时候,如果发现其父类还没有初始化,则先初始化其父类。
如:假设TestInit.class存在一个父类TestInitParent类,则在初始化TestInit时,首先会初始化TestInitParent类。
4.当虚拟机启动时,用户需要制定一个程序入口(带有main方法)的主类,则虚拟机会 先初始化这个类。
如:存在类TestMain存在一个方法,并且调用TestInit.class方法,则会先进行初始化TestMain方法。
5.当使用jdk1.7及以上的动态语言支持时,如果存在java.lang.reflect.MethodHandle实例最后解析ref_getstatic,ref_putstatic, ref_invokeStatic方法句柄时,并且对应类没有初始化过,则进行初始化。