👌Java类加载器的机制是什么?
题目详细答案
Java 的类加载机制是 JVM 负责将类文件加载到内存中,并将其转换为Class对象的过程。它包括三个主要步骤:加载(Loading)、链接(Linking)和初始化(Initialization)。以下是详细的描述:
类加载过程
加载(Loading)
加载阶段是将类文件读入内存,并创建一个Class对象的过程。具体步骤如下:
查找和导入类的二进制数据:从不同的来源(如文件系统、网络等)获取类的字节码。
创建Class对象:将字节码转换为 JVM 能够识别的Class对象。
加载阶段可以通过系统类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)和应用程序类加载器(Application ClassLoader)等完成。
链接(Linking)
链接阶段将类的二进制数据合并到 JVM 运行时环境中。链接阶段包括三个步骤:
验证(Verification):确保类的字节码符合 JVM 规范,保证不会破坏 JVM 的安全性。
准备(Preparation):为类的静态变量分配内存,并将其初始化为默认值。
解析(Resolution):将常量池中的符号引用转换为直接引用。
初始化(Initialization)
初始化阶段是执行类构造器
类加载器(ClassLoader)
Java 的类加载器负责加载类文件。Java 中的类加载器遵循双亲委派模型(Parent Delegation Model),即类加载器在加载类时会先委托给父类加载器加载,如果父类加载器无法加载,再尝试自己加载。
双亲委派模型(Parent Delegation Model)
双亲委派模型的工作流程如下:
- 检查缓存:类加载器首先检查缓存中是否已经加载过该类,如果已经加载,则直接返回Class对象。
- 委托父类加载:如果缓存中没有,则委托父类加载器加载。
- 父类加载失败:如果父类加载器加载失败(抛出ClassNotFoundException),则由当前类加载器尝试加载。
这种模型的好处是避免类的重复加载,确保核心类库不会被自定义类加载器加载和覆盖。
常见的类加载器
Bootstrap ClassLoader:引导类加载器,负责加载核心类库,如rt.jar中的类。它是用原生代码实现的,不是java.lang.ClassLoader的子类。
Extension ClassLoader:扩展类加载器,负责加载JAVA_HOME/lib/ext目录中的类。
Application ClassLoader:应用程序类加载器,负责加载应用程序的类路径(classpath)中的类。
类加载器的示例
1 | import java.io.IOException; |