Java虚拟机(JVM)中的类加载器采用了双亲委派模型(Delegation Model)。这是一种层次化的类加载机制,主要分为以下几个概念:

  1. 启动类加载器(Bootstrap Class Loader):

    • 是最顶层的类加载器,负责加载Java核心类库(如java.lang包下的类)。
    • 由C++实现,一般无法直接在Java代码中获取对其的引用。
  2. 扩展类加载器(Extension Class Loader):

    • 是启动类加载器的子类,负责加载java.ext.dirs系统属性指定的目录中的类库。
    • 通过sun.misc.Launcher$ExtClassLoader实现,可以通过Java代码获取引用。
  3. 应用程序类加载器(Application Class Loader):

    • 也称为系统类加载器,负责加载应用程序classpath路径上的类库。
    • 是扩展类加载器的子类,通过sun.misc.Launcher$AppClassLoader实现,可以通过Java代码获取引用。
  4. 自定义类加载器:

    • 继承ClassLoader类的用户自定义类加载器,可以加载用户自定义路径上的类。

双亲委派模型的工作流程:

  1. 当一个类加载器收到加载类的请求时,首先会检查自己是否已经加载过这个类。如果已经加载过,直接返回该类的Class对象。
  2. 如果类未加载,该加载器会将加载任务委派给其父类加载器,让父类加载器去尝试加载。这样的递归委派过程一直向上,直到达到启动类加载器。
  3. 如果启动类加载器无法加载该类,每个类加载器会尝试自己加载。如果加载成功,返回该类的Class对象;如果失败,再将加载任务委派给子类加载器。

优势和原理:

  • 优势: 避免类的重复加载,确保Java核心类库的一致性,提高安全性。
  • 原理: 当一个类加载器尝试加载类时,先委派给父类加载器,只有在父类加载器无法完成加载任务时,才尝试自己加载。这样层层递归,保证类的唯一性和一致性。

为何使用双亲委派模型:

  • 避免类冲突: 如果每个类加载器都可以自行加载类,可能会导致类的重复加载,引发冲突和混乱。
  • 确保安全性: 核心类库由启动类加载器加载,可以防止用户通过自定义类库替换核心类库,提高系统的安全性。
  • 提高效率: 通过委派给父类加载器,可以利用已加载类的缓存,减少类的重复加载,提高效率。

Was this helpful?

0 / 0

发表回复 0

Your email address will not be published.