静态代码块的执行

每个 Java类在被“首次主动使用”时都需要先进行类的加载。所谓的“首次主动使用”包括创建类的实例、访问类或接口的静态变量、被反射调用、初始化类的子类等。
类的加载就是 Java虚拟机将描述类的数据从Class文件加载到 JVM的过程,在这一过程中会对 Class文件进行数据加载、连接和初始化,最终形成可以被虚拟机直接使用的 Java类。
类的加载过程如图所示:
image.png

而在上图所示的初始化阶段,会执行类的静态代码块。静态代码块是类中一段由 static关键字标识的代码,它通常用来对类静态变量进行初始化。

例如,下面代码所示的静态代码块位于 MyBatis的Jdk类中,用来判断当前环境中是否存在java.lang.reflect.Parameter类,并根据结果初始化 parameterExists变量的值。
image.png
静态代码块会在类加载过程的初始化阶段执行,并且只会执行一次。一个类中可以有多个静态代码块,它们会按照顺序依次执行。

MyBatis 中存在众多的类,而这些类被“首次主动使用”的时间各不相同,因此不同类中的静态代码块的执行时机各不相同。但是,对于每一个类而言,类中的静态代码块都是这个类中首先被执行的代码。

因此,接下来系统调用任何一个类时,这个类的静态代码块必定已经执行完成。对于这一点,在后面的分析中不再单独提及。