建设银行手机网站变,南京市网站开发,网络培训的心得体会,盘丝洞app破解无限盘币JVM 类加载器的工作原理
类加载器#xff08;ClassLoader#xff09;是一个用于加载类文件的子系统#xff0c;负责将字节码文件#xff08;.class 文件#xff09;加载到 JVM 中。Java 类加载器允许 Java 应用程序在运行时动态地加载、链接和初始化类。
2. 类加载器的工…JVM 类加载器的工作原理
类加载器ClassLoader是一个用于加载类文件的子系统负责将字节码文件.class 文件加载到 JVM 中。Java 类加载器允许 Java 应用程序在运行时动态地加载、链接和初始化类。
2. 类加载器的工作过程
JVM 类加载过程主要包括以下三个阶段 加载Loading 搜索并加载类文件类加载器通过类名查找相应的 .class 文件并将其读取到内存中。生成 Class 对象将读取到的字节码转换成 JVM 能够识别的 Class 对象。 链接Linking 验证Verification确保字节码文件的正确性和安全性包括检查字节码格式是否正确操作码是否正确等。准备Preparation为类的静态变量分配内存并设置默认初始值。解析Resolution将符号引用转换为直接引用。 初始化Initialization 执行类构造器 clinit 方法这是由编译器自动生成的用于初始化类的静态变量和静态代码块。
3. 类加载器的类型
JVM 中有几种类型的类加载器每种类加载器有其特定的职责 引导类加载器Bootstrap ClassLoader 这是 JVM 自带的类加载器用于加载 Java 核心库即 JDK 安装目录下的 jre/lib/rt.jar 文件。 扩展类加载器Extension ClassLoader 加载位于 jre/lib/ext 目录中的类库或通过 java.ext.dirs 系统属性指定的类库。 应用程序类加载器Application ClassLoader 加载应用程序的类路径classpath下的类文件是用户自定义类加载的默认类加载器。 自定义类加载器Custom ClassLoader 用户可以通过继承 ClassLoader 类并重写其方法来定义自己的类加载器。
双亲委派模型
Java 的类加载器采用双亲委派模型Parent Delegation Model其核心思想是某个类加载器在加载类时首先将类加载请求委托给父类加载器只有在父类加载器无法完成加载时才尝试自己加载。这一模型可以有效避免类的重复加载确保 Java 核心类库的安全性。
双亲委派模型的工作流程
类加载请求当应用程序需要使用一个类时类加载器接收到该类的加载请求。委派父加载器当前类加载器首先将加载请求委派给它的父加载器。递归检查父加载器再将请求委派给它的父加载器依次递归直到到达引导类加载器。加载类 父加载器加载成功如果父加载器能够找到并加载该类则直接返回该类的 Class 对象。父加载器加载失败如果父加载器无法加载该类则返回给子加载器由子加载器尝试加载。
双亲委派模型的好处
保证核心类库的安全性通过双亲委派机制Java 核心类库如 java.lang.Object由引导类加载器统一加载避免了核心类库被篡改的风险。避免类的重复加载通过委派机制可以避免同一个类被多个类加载器重复加载从而减少内存消耗和潜在的类冲突问题。模块化和灵活性支持不同类加载器加载不同模块提高了系统的模块化和灵活性。
双亲委派模型的实现
Java 类加载器通过以下几个类和方法实现双亲委派模型
ClassLoader 类Java 提供了一个抽象类 ClassLoader所有类加载器都需要继承这个类。loadClass 方法ClassLoader 类的核心方法之一用于加载类。默认实现了双亲委派模型。
protected Class? loadClass(String name, boolean resolve) throws ClassNotFoundException {synchronized (getClassLoadingLock(name)) {// 检查类是否已经加载Class? c findLoadedClass(name);if (c null) {try {// 委派父加载器加载类if (parent ! null) {c parent.loadClass(name, false);} else {c findBootstrapClassOrNull(name);}} catch (ClassNotFoundException e) {// 父加载器未找到类}// 当前加载器尝试加载类if (c null) {c findClass(name);}}if (resolve) {resolveClass(c);}return c;}
}双亲委派模型的实例
假设有一个自定义类加载器 CustomClassLoader其父类加载器为系统类加载器。
public class CustomClassLoader extends ClassLoader {public CustomClassLoader(ClassLoader parent) {super(parent);}Overridepublic Class? findClass(String name) throws ClassNotFoundException {byte[] classData loadClassData(name);if (classData null) {throw new ClassNotFoundException();}return defineClass(name, classData, 0, classData.length);}private byte[] loadClassData(String name) {// 自定义加载类文件字节码的逻辑return null;}
}在加载类时CustomClassLoader 会首先将加载请求委派给父加载器系统类加载器如果系统类加载器无法找到该类才会使用 findClass 方法加载。
参考链接
Java 官方文档 - 类加载器