类加载是Java虚拟机(JVM)将类的字节码数据从类文件加载到内存中,并转换成运行时数据结构的过程。在Java中,类的加载是实现动态性的基础,它使得在运行时可以加载新的类,扩展应用程序的功能。
类加载的主要任务包括:
-
加载(Loading):
- 查找并加载类的字节码数据。
- 从文件系统、JAR文件、网络等地方获取类的字节码数据。
-
链接(Linking):
- 验证:确保加载的类符合Java语言规范,不会造成虚拟机错误。
- 准备:为类的静态变量分配内存并初始化默认值。
- 解析:将类中的符号引用转换为直接引用。
-
初始化(Initialization):
- 执行类的初始化代码,包括静态变量的赋值和静态代码块的执行。
类加载器(ClassLoader):
- 类加载由类加载器负责,Java虚拟机中有三种内置的类加载器:
- 启动类加载器(Bootstrap Class Loader): 负责加载Java核心类库,是虚拟机自身的一部分,用原生代码实现。
- 扩展类加载器(Extension Class Loader): 负责加载Java的扩展库,由Java编写,是
sun.misc.Launcher$ExtClassLoader
的实例。 - 应用程序类加载器(Application Class Loader): 负责加载应用程序的类,也叫系统类加载器,是
sun.misc.Launcher$AppClassLoader
的实例。
双亲委派模型:
- Java虚拟机采用了双亲委派模型,即每个类加载器在加载类时,都会先将加载任务委派给其父类加载器,只有在父类加载器无法加载时,才由子类加载器自行加载。这样可以保证类的唯一性,避免类的重复加载,确保Java核心类库的一致性和安全性。
应用场景:
- 动态加载:允许在运行时加载新的类,实现插件机制和动态扩展。
- 热部署:允许在应用程序运行时替换和更新类,无需重新启动应用。
- 安全性:通过双亲委派模型,确保Java核心类库由系统类加载器加载,避免用户自定义类库替换核心类库,提高系统的安全性。
Was this helpful?
0 / 0