Java类加载过程是指将.class文件中的字节码数据加载到内存中,并生成对应的Class对象的过程。Java类加载器(ClassLoader)负责执行这个任务。Java类加载过程主要包括以下几个步骤:
-
加载(Loading):
- 类加载器通过类的全限定名(包括包名)来读取类文件(.class文件)的二进制数据流。
- 加载的来源可以是本地文件系统、网络等。
-
链接(Linking):
- 链接过程分为三个阶段:验证(Verification)、准备(Preparation)、解析(Resolution)。
a. 验证(Verification):
- 确保被加载的类的字节码符合Java虚拟机规范,包括语法和语义的验证。
b. 准备(Preparation):
- 为类的静态变量分配内存空间,并设置默认初始值(零值),这些数据存放在方法区中。
c. 解析(Resolution):
- 将类、接口、字段和方法的符号引用解析为直接引用。符号引用是一组符号来描述所引用的目标,直接引用则是直接指向目标的指针、偏移量或句柄。
-
初始化(Initialization):
- 初始化阶段是类加载的最后一步,也是真正执行类中静态变量赋值和静态代码块的过程。
- JVM会按照类加载时的顺序执行类中的静态变量赋值和静态代码块。
- 如果一个类在初始化阶段之前已经被初始化过,则不会再次触发初始化。
-
使用(Usage):
- 当对类进行实例化、访问静态变量、调用静态方法或者使用反射等方式引用类时,会触发类的初始化。
- 如果类加载过程中出现错误,会抛出ClassNotFoundException或NoClassDefFoundError等异常。
类加载器根据类的名称定位并读取类文件,然后将其转换为Class对象,最终交给Java虚拟机进行实例化和执行。