双亲委派模型

109 阅读2分钟

什么是类加载

类加载是Java类加载器把编译好的.class文件加载到Java虚拟机(JVM)中的运行时数据区中,供执行引擎调用。

Java类加载层级

类加载的继承是通过组合而不是继承实现的。

  1. 启动类加载器(BootClassLoader): Java虚拟机启动后创建的第一个类加载器,由C++语言实现,所以我们在Java代码中查看其信息时,看到的均为 null
  2. 扩展类加载器(ExtClassLoader): Java语言实现,父类加载器为 null
  3. 系统类加载器(AppClassLoader): Java语言实现,父类加载器为 ExtClassLoader 继承 URLClassLoader
  4. 用户自定义类加载器(CustomClassLoader): Java编写,用户自定义的类加载器,可加载指定路径的class文件。

双亲委派机制

在JVM中表示两个class对象是否为同一个类对象存在两个必要条件:

  1. 类的完整类名必须一致,包括包名。
  2. 加载这个类的ClassLoader(指ClassLoader实例对象)必须相同。

当某个类加载器需要加载某个.class文件时,它首先把这个任务委托给他的上级类加载器,递归这个操作,如果上级的类加载器没有加载,自己才会去加载这个类。

双亲委派作用

  • 防止重复加载同一个.class。通过委托去向上面问一问,加载过了,就不用再加载一遍。保证数据安全。
  • 保证核心.class不能被篡改。通过委托方式,不会去篡改核心.clas,即使篡改也不会去加载,即使加载也不会是同一个.class对象了。不同的加载器加载同一个.class也不是同一个Class对象。这样保证了Class执行安全。