在Java虚拟机中,存在多种类加载器,它们负责加载类文件到Java虚拟机中。主要的类加载器包括以下几种:
-
引导类加载器(Bootstrap Class Loader):
- 负责加载Java核心类库,即位于
%JAVA_HOME%/lib
目录下的rt.jar
等文件。 - 是虚拟机的一部分,用本地代码实现,不继承自
java.lang.ClassLoader
。 - 在Java中无法直接获取引导类加载器的引用。
- 负责加载Java核心类库,即位于
-
扩展类加载器(Extension Class Loader):
- 负责加载Java的扩展库,即位于
%JAVA_HOME%/lib/ext
目录下的jar包。 - 由
sun.misc.Launcher$ExtClassLoader
实现,继承自java.net.URLClassLoader
。
- 负责加载Java的扩展库,即位于
-
应用程序类加载器(Application Class Loader):
- 也称为系统类加载器,负责加载应用程序classpath下的类。
- 是最常用的类加载器,由
sun.misc.Launcher$AppClassLoader
实现,继承自java.net.URLClassLoader
。
-
自定义类加载器:
- 继承自
java.lang.ClassLoader
的用户自定义类加载器。 - 开发者可以通过继承ClassLoader类,实现自定义的类加载器,用于加载特定位置或特殊格式的类。
- 继承自
这些类加载器之间形成了一种层次结构,被称为双亲委派模型。在类加载过程中,当一个类加载器收到加载类的请求时,它首先会委托给父类加载器进行加载,只有在父类加载器无法完成加载时,子类加载器才会尝试加载。这种层次结构的设计有助于确保Java类的一致性、安全性,并避免类的重复加载。
在使用自定义类加载器时,可以通过继承ClassLoader并覆盖findClass
方法实现自定义的类加载逻辑。自定义类加载器常见于一些特殊的类加载需求,比如加载加密的类文件、从数据库中加载类等。
Was this helpful?
0 / 0