Java 双亲委派

一、Java类加载器

首先引入一个概念什么是Java类加载器?

一句话总结:类加载器(class loader)用来加载 Java 类到 Java 虚拟机中。

官方总结:Java类加载器(英语:Java Classloader)是Java运行时环境(Java Runtime Environment)的一部分,负责动态加载Java类到Java虚拟机的内存空间中。类通常是按需加载,即第一次使用该类时才加载。由于有了类加载器,Java运行时系统不需要知道文件与文件系统。

每个Java类必须由某个类加载器装入到内存。

JVM中有3个默认的类加载器:

  1. 启动类加载器 (Bootstrap Class Loader)
  2. 扩展类加载器(Extension Class Loader)
  3. 应用程序类加载器(Application Class Loader)

在这里插入图片描述
为什么要有三个类加载器,一方面是分工,各自负责各自的区块,就如Application Class Loader主要负责加载用户之间开发的代码,另一方面为了实现委托模型。


一个应用程序总是由n多个类组成,Java程序启动时,并不是一次把所有的类全部加载后再运行,它总是先把保证程序运行的基础类一次性加载到jvm中,其它类等到jvm用到的时候再加载。

在这里插入图片描述

二、双亲委派模型

第一次听到双亲委派模型这个概念确实有些模糊和不容易理解,我们可以通过图片和实用场景进一步加深对这个概念的学习和了解。

The Java platform uses a delegation model for loading classes. The basic idea is that every class loader 
has a “parent” class loader. 
When loading a class, a class loader first “delegates” the search for the class to its parent class loader before 
attempting to find the class itself.

双亲委派模型,要求除了顶层的启动类加载器外,其余的类加载器都应当有自己的父类加载器。

Java平台通过委派模型去加载类。每个类加载器都有一个父加载器。

  1. 当需要加载类时,会优先委派当前所在的类的加载器的父加载器去加载这个类。
  2. 如果父加载器无法加载到这个类时,再尝试在当前所在的类的加载器中加载这个类。

在这里插入图片描述
1、因为双亲委派是向上委托加载的,所以它可以确保类只被加载一次,避免重复加载

1、共享功能:一些framework层级的类一旦被顶层加载器加载,缓存在内存。在其他任何地方用到时,都遵守双亲加载机制,派发到顶层加载器
2、因已经加载,所以都不需要重新加载。

2、避免核心类被串改:Java的核心API都是通过引导类加载器进行加载的,如果别人通过定义同样路径的类比如java.lang.Integer,类加载器通过向上委托,两个Integer,那么最终被加载的应该是jdk的Integer类,而并非我们自定义的,这样就避免了我们恶意篡改核心包的风险

1、隔离功能:保证核心类库的纯净和安全,防止恶意加载。

猜你喜欢

转载自blog.csdn.net/u014641168/article/details/129867628