Java 中有哪些类加载器?

· 约 4 分钟读完 · 第 109 / 274 章

推荐答案

在Java中,类加载器(ClassLoader)负责将类的字节码文件加载到JVM中。Java中的类加载器主要有以下几种:

  1. Bootstrap ClassLoader(启动类加载器):负责加载JVM核心类库,如java.lang.*、java.util.*等。它是用C/C++实现的,是JVM的一部分,不是Java类。
  2. Extension ClassLoader(扩展类加载器):负责加载JAVA_HOME/lib/ext目录下的类库,或者由java.ext.dirs系统属性指定的路径中的类库。
  3. Application ClassLoader(应用程序类加载器):也称为系统类加载器(System ClassLoader),负责加载用户类路径(ClassPath)上的类库。它是ClassLoader.getSystemClassLoader()的返回值。
  4. Custom ClassLoader(自定义类加载器):开发者可以通过继承java.lang.ClassLoader类来实现自定义的类加载器,以满足特定的加载需求。

本题详细解读

1. Bootstrap ClassLoader

  • 作用:加载JVM核心类库,如rt.jar中的类。
  • 特点:由C/C++实现,是JVM的一部分,不是Java类。因此,在Java代码中无法直接引用它。
  • 加载路径:JAVA_HOME/lib目录下的核心类库。

2. Extension ClassLoader

  • 作用:加载Java的扩展类库。
  • 特点:由Java实现,是sun.misc.Launcher$ExtClassLoader类的实例。
  • 加载路径:JAVA_HOME/lib/ext目录下的类库,或者由java.ext.dirs系统属性指定的路径。

3. Application ClassLoader

  • 作用:加载用户类路径(ClassPath)上的类库。
  • 特点:由Java实现,是sun.misc.Launcher$AppClassLoader类的实例。它是ClassLoader.getSystemClassLoader()的返回值。
  • 加载路径:用户指定的ClassPath路径。

4. Custom ClassLoader

  • 作用:开发者可以通过继承java.lang.ClassLoader类来实现自定义的类加载器,以满足特定的加载需求。
  • 特点:可以自定义类加载的逻辑,例如从网络、数据库或其他非标准位置加载类。
  • 应用场景:常用于热部署、模块化加载、类隔离等场景。

类加载器的双亲委派模型

Java的类加载器采用双亲委派模型(Parent Delegation Model),即当一个类加载器收到类加载请求时,它首先不会自己去加载,而是将请求委派给父类加载器去完成。只有当父类加载器无法完成加载时,子类加载器才会尝试自己去加载。

这种模型的好处是:

  • 安全性:防止核心类库被篡改。
  • 避免重复加载:确保类只被加载一次。

自定义类加载器的实现

开发者可以通过继承ClassLoader类并重写findClass方法来实现自定义类加载器。例如:

通过自定义类加载器,开发者可以实现灵活的类加载机制,满足特定的业务需求。