java类加载器的分类

Java类加载器分为启动类加载器、扩展类加载器和应用程序类加载器,分别负责加载核心库、扩展库和用户类路径中的类,遵循双亲委派模型以确保类的唯一性和安全性,且可自定义类加载器实现特殊加载需求。

Java类加载器(ClassLoader)负责在运行时动态加载类到JVM中。根据实现方式和职责的不同,Java中的类加载器主要分为以下三类:

1. 启动类加载器(Bootstrap ClassLoader)

特点:

  • 由C/C++语言实现,是JVM的一部分,不属于Java语言层面的类。
  • 负责加载JVM核心类库,例如rt.jartools.jarresources.jar等,这些位于JAVA_HOME/jre/lib目录下。
  • 无法被Java程序直接引用,调用其方法会返回null

2. 扩展类加载器(Extension ClassLoader)

特点:

  • 由Java语言实现,是sun.misc.Launcher$ExtClassLoader类的实例。
  • 父类加载器为Bootstrap ClassLoader。
  • 负责加载JAVA_HOME/jre/lib/ext目录下的JAR包或系统属性java.ext.dirs指定路径中的类库。

3. 应用程序类加载器(Application ClassLoader) / 系统类加载器(System ClassLoader)

特点:

  • 由Java语言实现,是sun.misc.Launcher$AppClassLoader类的实例。
  • 父类加载器为Extension ClassLoader。
  • 负责加载用户类路径(ClassPath)上指定的类库,即项目中自己编写的类或第三方依赖(如lib/*.jar)。
  • 是默认的类加载器,如果没有自定义类加载器,应用程序通常使用它来加载类。

这三类加载器之间遵循双亲委派模型:当一个类加载器收到类

加载请求时,不会自己立即尝试加载,而是先委托给父类加载器去完成,直到Bootstrap ClassLoader。只有当父类加载器无法完成加载时,子加载器才会尝试自己加载。这种机制保证了类的唯一性和安全性。

开发者也可以通过继承java.lang.ClassLoader来实现自定义类加载器,用于从网络、加密文件或其他非标准来源加载类。

基本上就这些。理解类加载器的分类和工作原理,有助于深入掌握Java的类加载机制和解决实际开发中的类冲突等问题。