类加载机制是指class文件加载到JVM,并形成class对象的机制,之后应用就可对class对象进行实例化并调用,类加载机制可在运行时动态加载外部的类、远程网络下载过来的class文件等。除了该动态化优点外,还可通过JVM的类加载机制来达到隔离的效果,如Application Server中通常要避免两个应用的类相互干扰。
JVM类加载过程可以分为3个步骤:装载(Load)、链接(Link)和初始化(Initialize)。其中初始化过程不是加载类时必须触发的,但最迟必须在初次主动使用对象前执行,其动作为给静态变量赋值、调用<clinit>()等。
1、装载:负责找到二进制字节码并加载到JVM,JVM通过类的全限定名及类加载器完成类的加载。
2、链接:负责对二进制字节码的格式进行校验、初始化装载类中的静态变量及解析类中调用的接口、类。
验证:确保被加载类的正确性;
准备:为类的静态变量分配内存,并将其初始化为默认值;
解析:把类中的符号引用转换为直接引用;
3、初始化:初始化过程即执行类中的静态初始化代码、构造器代码以及静态属性的初始化,在以下四种情况下初始化过程会被触发执行。
a:调用了new;
b:反射调用了类中的方法;
c:子类调用了初始化;
d:JVM启动过程中指定的初始化类;
JVM的类加载通过ClassLoad及其子类完成,分为Bootstrap ClassLoader、Extension ClassLoader、System ClassLoader 及User-Defined ClassLoader。这四种ClassLoader的关系如图。