JAVA中类加载器与双亲委派模型面试题详解

98 阅读4分钟

Java中有哪些类加载器

实现通过类的权限定名获取该类的二进制字节流的代码块叫做类加载器

在Java中,类加载器(Class Loader)是负责加载Java类文件到内存中的组件。Java中的类加载器主要分为三种类型:

  1. Bootstrap ClassLoader(启动类加载器):它是Java虚拟机的一部分,负责加载Java核心类库,如java.lang包中的类。由于它是虚拟机的一部分,不是一个普通的Java类,所以没有对应的Java类对象。它是由C++编写的,通常无法直接获取。
  2. Extension ClassLoader(扩展类加载器):它是负责加载Java扩展类库,位于JRE的lib/ext目录下的JAR包或者用户自定义的扩展目录中的类库。可以通过javax.management.loading.ClassLoaderRepository接口的getExtensionClassLoader()方法获取。
  3. Application ClassLoader(系统类加载器):它是负责加载应用程序的类,也就是我们自己编写的Java类。它会加载类路径(Classpath)下的类和用户自定义的类。

除了这三种常见的类加载器,Java还支持自定义类加载器。通过继承java.lang.ClassLoader类,我们可以实现自己的类加载器,用于加载特定位置或者特定格式的类。自定义类加载器常用于实现类的动态加载、热更新等需求。

类加载器按照一定的层次结构进行工作,即父类加载器委派给子类加载器进行加载。这样可以保证类在整个应用程序中的唯一性和隔离性。

总结一下,Java中常见的类加载器包括启动类加载器、扩展类加载器和系统类加载器。除此之外,还可以通过自定义类加载器来实现特定需求。类加载器按照层次结构工作,用于加载Java类文件到内存中

说说类加载器双亲委派模型

在介绍双亲委派模型之前先说下类加载器。对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立在 JVM 中的唯一性,每一个类加载器,都有一个独立的类名称空间。类加载器就是根据指定全限定名称将 class 文件加载到JVM 内存,然后再转化为 class 对象。

04.jpg 类加载器分类:

• 启动类加载器(Bootstrap ClassLoader),是虚拟机自身的一部分,用来加载 Java_HOME/lib/目录中的,或者被 -Xbootclasspath 参数所指定的路径中并且被虚拟机识别的类库;

• 其他类加载器:• 扩展类加载器(Extension ClassLoader):负责加载\lib\ext 目录或Java. ext. dirs 系统变量指定的路径中的所有类库;

• 应用程序类加载器(Application ClassLoader)。负责加载用户类路径(classpath)上的指定类库,我们可以直接使用这个类加载器。一般情况,如果我们没有自定义类加载器默认就是用这个加载器。

双亲委派模型:

双亲委派模型(Parent Delegation Model)是Java中的一种类加载机制。它的核心思想是将类加载的请求委托给父类加载器进行处理,如果父类加载器无法加载,则由子类加载器尝试加载。

如果一个类加载器收到了类加载的请求,它首先不会自己去加载这个类,而是把这个请求委派给父类加载器去完成,每一层的类加载器都是如此,这样所有的加载请求都会被传送到顶层的启动类加载器中,只有当父加载无

法完成加载请求(它的搜索范围中没找到所需的类)时,子加载器才会尝试去加载类。当一个类收到了类加载请求时,不会自己先去加载这个类,而是将其委派给父类,由父类去加载,如果此时父类不能加载,反馈给子类,由子类去完成类的加载,如果加载成功,就返回Class对象给请求方,否则抛出ClassNotFoundException异常。

通过这种双亲委派模型,可以实现类加载器的层次化结构,保证了类的唯一性和隔离性。这样可以有效避免类的重复加载,提高了程序的安全性和可靠性。