MST

星途 面试题库

面试题:Java类加载机制中双亲委派模型的工作流程是什么

请详细描述Java类加载机制里双亲委派模型的具体工作流程,包括类加载器之间的交互以及这样设计的好处。
44.8万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

双亲委派模型工作流程

  1. 类加载请求发起:当一个类加载器收到类加载请求时,它并不会立即尝试加载该类。例如,应用程序中使用ClassLoader.loadClass("com.example.SomeClass")请求加载类。
  2. 向上委托:该类加载器会首先将类加载请求委派给它的父类加载器。这一过程会沿着类加载器层次结构向上传递,依次经过应用程序类加载器(AppClassLoader)、扩展类加载器(ExtClassLoader),最终到达启动类加载器(Bootstrap ClassLoader)。例如,假设当前是应用程序类加载器收到请求,它会将请求传递给扩展类加载器,扩展类加载器再传递给启动类加载器。
  3. 父类加载器尝试加载:每个父类加载器在收到请求后,都会尝试在自己负责的加载路径中查找并加载该类。启动类加载器会先在它所负责的核心类库路径(如$JAVA_HOME/jre/lib下的核心类库)中查找类。如果找到了对应的类,就会将其加载到内存中,完成类加载过程。例如,如果要加载java.lang.Object类,启动类加载器在核心类库中能找到,就会加载。
  4. 加载失败处理:如果父类加载器在自己的加载路径中没有找到该类,它会将加载任务返回给子类加载器。例如,启动类加载器找不到类,就把任务返回给扩展类加载器。扩展类加载器再尝试在自己负责的加载路径(如$JAVA_HOME/jre/lib/ext目录下的类库)中加载。若还是找不到,继续返回给下一级子类加载器,直到最初发起请求的类加载器。例如,最终回到应用程序类加载器,应用程序类加载器会在应用程序的类路径(通常是CLASSPATH环境变量指定的路径)中查找并加载类。

类加载器之间的交互

  1. 委托关系:类加载器之间形成了一种树形的层次结构,每个类加载器都有一个父类加载器(除了启动类加载器没有父类加载器,在Java代码中用null表示)。这种委托关系使得类加载请求能够沿着层次结构向上传递。
  2. 反馈机制:当父类加载器无法加载类时,会将加载任务反馈给子类加载器,子类加载器尝试在自己的加载路径中加载,形成一种上下交互的过程。

双亲委派模型设计的好处

  1. 避免类的重复加载:如果一个类已经被某个父类加载器加载过,那么子类加载器不会再次加载相同的类。例如,java.lang.Object类已经由启动类加载器加载,所有其他类加载器不会再重复加载这个类,保证了类在内存中的唯一性,节省了内存空间。
  2. 确保安全性:核心类库由启动类加载器加载,这些类库中的类不会被用户自定义的类加载器替换或篡改。比如,恶意代码无法通过自定义类加载器加载一个伪造的java.lang.Object类来破坏系统的正常运行,保证了Java系统的安全性。
  3. 提高系统的稳定性:由于类加载的层次分明,每个类加载器负责特定范围的类加载,使得Java系统的类加载体系结构清晰,有利于维护系统的稳定性。例如,不同层次的类库由相应的类加载器加载,相互之间不会产生冲突,使得整个Java运行环境更加稳定。