一、类加载的过程
类加载是Java虚拟机(JVM)将类文件加载到内存中并转换成对应的类对象的过程。它确保了类文件能够正确加载并转换成可执行的类对象,为程序的执行提供了必要的基础设施。类加载过程主要包括以下几个步骤:
- 加载(Loading):加载是指将类的字节码文件(.class文件)从磁盘或者网络中读取到内存中的过程。类加载器根据类的全限定名(Fully Qualified Name)来定位和加载类文件。加载过程不包括对类文件的解析和验证,仅仅是将字节码加载到内存中形成类对象的初始状态。
- 验证(Verification):验证是指对加载的类文件进行字节码验证、符号引用验证等过程,确保类文件的格式和内容符合Java虚拟机规范,防止恶意代码或者不规范的代码对系统造成安全漏洞或者错误。
- 准备(Preparation):准备是指为类的静态变量分配内存空间,并设置默认初始值的过程。在准备阶段,静态变量会被初始化为默认值,例如整数类型的默认值是0,引用类型的默认值是null。
- 解析(Resolution):解析是指将类中的符号引用转换为直接引用的过程。在Java中,类的方法调用、字段访问等操作都是通过符号引用来实现的,解析阶段将这些符号引用转换为实际内存地址,使得程序可以直接访问类的方法和字段。
- 初始化(Initialization):初始化是指执行类的初始化代码(静态代码块和静态变量赋值语句)的过程。在初始化阶段,JVM会按照类加载的先后顺序依次执行静态代码块和静态变量赋值语句,完成类的初始化工作。
需要注意的是,类加载过程是按需进行的,并不是一次性加载所有类文件。当程序需要使用某个类时,类加载器会先加载该类及其所依赖的类,然后进行验证、准备、解析和初始化操作。类加载器会按照委派模型逐级向上委托加载类,直到找到合适的类加载器为止。
对于已经加载的类会被放在 ClassLoader
中。在类加载的时候,系统会首先判断当前类是否被加载过。已经被加载的类会直接返回,否则才会尝试加载。也就是说,对于一个类加载器来说,相同二进制名称的类只会被加载一次。
下面这个截图是ClassLoader类,里面有一个Vector变量用来存由这个类加载器加载的类。