【Java】双亲委派机制

Java是运行在Java的虚拟机(JVM)中的,但是它是如何运行在JVM中了呢?
编写的Java源代码被编译器编译成.class的字节码文件,然后由ClassLoader负责将这些class文件给加载到JVM中去执行。

ClassLoader[类加载器]

ClassLoader是Java运行时环境(JRE)的一部分,具体作用就是将class文件加载到jvm虚拟机中去,程序就可以正确运行了。
注意:jvm启动的时候,并不会一次性加载所有的class文件,而是根据需要去动态加载,避免一次性加载过多class(jar包多),导致内存崩溃。

 JVM中提供了三层的ClassLoader:
 引导类加载器(Bootstrap classLoader):最顶层的加载类,主要负责加载核心的类库(java.lang.*等),同时加载另外两种类加载器(由C++编写)Extensions ClassLoader和Application ClassLoader;
 扩展类加载器(Extensions ClassLoader):主要负责加载jre/lib/ext目录下的一些扩展的jar,还可以加载-D java.ext.dirs选项指定目录的jar;
 应用类加载器(Application ClassLoader):也称为SystemAppClass主要负责加载应用程序的主函数类,它根据Java应用的类路径(CLASSPATH)来加载Java类,一般来说Java应用的类都是由它来完成加载的。

什么是双亲委派机制?

双亲委派机制是指当某个特定的类加载器在收到类加载的请求时,会遵循下面的规则顺序:

  1. 首先判断被加载的类是否已经加载过,如果是则结束,否则会将加载任务委托给自己的父亲;

  2. 父类加载器在收到类加载的请求时,也会先判断被加载的类是否已经加载过,如果是则结束,否则同样将加载任务委托给自己的父亲;

  3. 不断的循环进行步骤2,直到将加载任务委托给Bootstrap ClassLoader为止。此时,Bootstrap ClassLoader会先判断被加载的类是否已经加载过,如果是则结束;

  4. Bootstrap ClassLoader会判断能否完成加载任务,如果能则直接加载,否则会将加载任务交给儿子类加载器

  5. 儿子类加载器也会判断能否完成加载任务,如果能则直接加载,否则会再一次将加载任务交给儿子类加载器;

  6. 不断的循环进行步骤5,直到最后一个类加载器,如果这个类加载器仍然不能够加载这个类,就会抛出一个异常:ClassNotFoundException。

    image

为什么要设计这种机制?

这种机制好处是:

  1. 一定程度上防止了危险代码的植入,保证了java核心库的安全性;
  2. 保证同一个类不会被加载多次。

例如:有人想替换系统级别的类[String.java等]篡改它的实现,在这种机制下这些系统的类已经被Bootstrap classLoader加载过了(因为当一个类需要加载的时候,最先去尝试加载的就是BootstrapClassLoader),所以其他类加载器并没有机会再去加载。

posted @   Eason0520  阅读(300)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示