JAVA 双亲委派机制

java语言中支持4种类加载器:

  1. Bootstrap ClassLoader 启动类加载器

  2. Extention ClassLoader 标准扩展类加载器

  3. Application ClassLoader 应用类加载器

  4. User ClassLoader 用户自定义类加载器

当一个类收到了一个类加载的请求的时候,他不会直接去加载指定的类,而是把这个请求委托给自己的父加载器去加载,只有父加载器无法加载的时候,才会由当前加载器去负责类的加载。

这四种类加载器,各有各的职责:

  • Bootstrap ClassLoader ,主要负责加载Java核心类库,%JRE_HOME%\lib下的rt.jar、resources.jar、charsets.jar和class等。

  • Extention ClassLoader,主要负责加载目录%JRE_HOME%\lib\ext目录下的jar包和class文件。

  • Application ClassLoader ,主要负责加载当前应用的classpath下的所有类

  • User ClassLoader , 用户自定义的类加载器,可加载指定路径的class文件

也就是说,一个用户自定义的类,如com.test.Test是无论如何也不会被Bootstrap和Extention加载器加载的。
通过委派的方式,可以避免类的重复加载,当父加载器已经加载过一个类的时候,子加载器不会再重新加载这个类。

而且通过双亲委派的方式,还保证了安全性,因为Bootstrap ClassLoader在加载的时候,只会加载JAVA_HOME中的jar包里面的类,如java.lang.Integer,这个类是不会被随意替换的,除非有人跑到你的机器上,破坏你的JDK。

实现双亲委派的代码就在java.lang.ClassLoader类的loadClass方法中,大概逻辑:

  1. 先检查类是否被加载过

  2. 如果没有加载则调用父加载器的loadClass方法进行加载

  3. 如果父加载器为空则默认使用启动类加载器(bootstrapclass loader)作为父加载器

  4. 如果父加载器加载失败,抛出ClassNotFoundException异常后,在调用自己的findClass方法进行加载。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一.Java有4种类加载器 Bootstrap ClassLoader(启动类加载器):加载<JAVA_HOME>...
    OhIAm阅读 4,377评论 0 0
  • 什么是双亲委派机制 当某个类加载器需要加载某个.class文件时,它首先把这个任务委托给他的上级类加载器,递归这个...
    MrH_永无BUG阅读 2,256评论 0 2
  • 双亲委派机制定义:当一个类加载器收到了类加载的请求的时候,他不会直接去加载指定的类,而是把这个请求委托给自己的父加...
    Ivy__阅读 13,568评论 0 1
  • 一句话概括 双亲委派机制保证了JVM的严谨性、安全性双亲委派机制标准有四层父子关系classLoader(类加载器...
    double_hi阅读 4,336评论 0 4
  • 转载Hollis,原文地址[https://mp.weixin.qq.com/s/Q0MqcvbeI7gAcJH5...
    EdgeE阅读 1,937评论 0 0