Java 类加载器
原文: https://javabeginnerstutorial.com/core-java-tutorial/java-class-loader/
简介:什么是类加载器
应用中的所有类文件在启动时都不会加载到内存中,而是根据程序的需要按需加载,此类的加载是由类加载器完成的。 类加载器是 JVM 的一部分,可将类加载到内存中。
Java 类加载器是用 Java 本身编写的(与以 C++ 编写的 JVM 相反)。 这意味着在需要时可以轻松开发自定义类加载器,而无需了解 JVM 的细节。 ClassLoader
是一个抽象类,它是java.lang
包的一部分。
类加载器的工作方式
一个应用可能需要不同的类才能在运行时正常运行,每当一个应用在运行时需要一个类时,类加载器都会查找给定的类名,如果找到则将其加载到内存中。 提供要加载的类的名称后,类加载器将尝试在不同位置查找构成类定义的数据。
类加载器搜索的位置将按照给定的顺序。
- 首先在 JRE 的
lib/ext
目录以及系统范围,特定于平台的扩展目录中的 JAR 文件中查找类。 - 其次在类路径(
java.class.path
属性)中查找该类。 类路径的默认值是当前目录,但是可以用不同的方式更改此值。
类加载器层次结构
ClassLoader
使用委托模型来搜索要加载的类和资源。 每个ClassLoader
实例将具有
关联的父类加载器。 当类加载器获得查找类的请求时,给定的 ClassLoader
会在尝试查找类或资源本身之前将对类或资源的搜索委托给其父类加载器。 Bootstrap 类加载器位于类加载器层次结构的顶部。 Bootstrap 类加载器是虚拟机中的内置类加载器。 Bootstrap 类加载器没有任何父项。
类加载器的类型
Java 类加载器可以分为 4 种类型。
自举类加载器
它是超类加载器。 它没有任何父类类加载器。 它将 Java 的核心类(如java.lang
,java.util
包中的类)加载。
扩展类加载器
扩展类加载器将在 JRE 的lib/ext
目录以及系统范围,特定于平台的扩展目录中的 JAR 文件中加载类。 自举类加载器将是扩展类加载器的父级。 开发人员可以在ext
文件夹中手动添加 jar,以使其由扩展类加载器加载。
系统类加载器
系统类加载器将在类路径(java.class.path
属性)中加载类。 扩展类加载器作为系统类加载器的父级。 类路径的默认值是当前目录,但是可以用不同的方式更改此值。
- 设置
CLASSPATH
环境变量。 - 通过
-classpath
或-cp
命令行选项提供的值。
自定义类加载器
开发人员还可以根据需要创建自定义类。
使用自定义类加载器的优势
- 应用服务器中的热部署
- 自定义类加载器,以供浏览器在执行不受信任的代码之前检查安全性证书。