classLoader提前加载.class文件到内存中,在类加载时,使用的是Parents Delegation Model。译为双亲委派模型,意译则是“溯源委派加载模型”。
java的类加载器是一个运行时核心基础设施模块,主要是在启动之初进行类的Load、Link和Init,即加载,链接,初始化。
第一步,Load阶段读取类文件产生二进制流,并转化为特定的数据结构,初步校验cafe babe魔法数、常量池、文件长度、是否有父类等,然后创建对应类的java.lang.Class实例。
第二步,Link阶段包括验证、准备、解析三个步骤。验证是更详细的检验,比如final是否合规、类型是否正确、静态变量是否合理等;准备阶段是为静态变量分配内存,并设定默认值,解析类和方法确保类与类之间的相互引用正确性,完成内存结构布局。
第三步,Init阶段执行类构造器<clinit>方法,如果赋值运算是通过其他类的静态方法来完成的,那么会马上解析另外一个类,在虚拟机栈中执行完毕后通过返回值进行赋值。
类加载时一个将.class字节码文件实例化Class对象并进行相关初始化的过程。在这个过程中,JVM会初始化继承树上还没有被初始化的所有父亲,并且会执行这个链路上所有未执行过的静态代码块、静态变量赋值语句等。某些类在使用时,也可以按需由类加载器进行加载。