谈谈你对双亲委派模型的理解?工作过程?为什么要使用

应用程序一般是由上诉的三种类加载器相互配合进行加载的,如果有必要,还可以加入自己定义的类加载器,它们的关系如下图所示:

image-20210604001108695

  • 双亲委派模型的工作过程:

如果一个类加载器收到了类加载请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成。每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父类加载器反馈自己无法完成这个加载请求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去加载。

  • 使用双亲委派模型的好处:

Java 类随着它的类加载器一起具备了一种带有优先级的层次关系。例如:类 java.lang.Object,它存放在 rt.jar 中,无论哪一个类加载器需要加载这个类,最终都是委派给处于模型最顶端的启动类加载器进行加载,因此 Object 类在程序的各种类加载器环境中都是同一个类(使用的是同一个类加载器加载的)。相反,如果没有使用双亲委派模型,由各个类加载器自行去加载的话,如果用户自己编写了一个 java.lang.Object 类,并放在程序的 ClassPath 中,那么系统将会出现多个不同的 Object 类,Java 类型体系中最基础的行为也就无法保证,应用程序也将变得一片混乱。

  • 双亲委派模型的主要代码实现:

实现双亲委派的代码都集中在 java.lang.ClassLoader 的 loadClass() 方法中,逻辑清晰易懂:先检查是否已经被加载过,若没有加载则调用父加载器的 loadClass() 方法,若父加载器为空则默认使用启动类加载器作为父类加载器。如果父类加载失败,抛出 ClassNotFoundException 异常后,再调用自己的 findClass() 方法进行加载。

发表评论

后才能评论

评论(3)

  • ? 普通 2022-07-03 8:56 下午

    我觉得 双亲的优点用宋老师总结的这个比较直观
    1. 避免类的重复加载
    2. 保护程序安全,防止核心API被随意篡改
    – 自定义类:自定义java.lang.String 没有被加载。
    – 自定义类:java.lang.ShkStart(报错:阻止创建 java.lang开头的类)

  • 小闹 普通 2021-10-19 10:31 上午

    双亲委派的工作过程,应该是先去查找是否已经加载过该类,没有加载的话再去查找父类加载器吧?