双亲委托模式

类加载的双亲委托模式

  1. 类加载器的作用

将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区的运行时数据结构,然后在堆中生成一个代表这个类的java.lang.Class对象,作为方法区中类数据的访问入口。

  1. 类加载器的分类

    1.引导类加载器(Bootstap Classloader):使用C++编写,JVM自带的类加载器,负责加载Java平台核心库(jre/lib/rt.jar等)。该加载器是无法直接获取的,当使用getClassLoader()方法去获取时结果为null。
    2.扩展类加载器(Extension ClassLoader): 负责加载java平台中扩展功能的一些jar包,包括$JAVA_HOME中jre/lib/ext/*.jar或-Djava.ext.dirs指定目录下的jar包。
    3.应用程序类加载器(AppClassLoader):也叫系统类加载器,负责加载classpath中指定的jar包及目录中class.
    4.用户自定义加载器  Java.lang.ClassLoader的子类,用户可以定制类的加载方式.
    
  2. 什么是双亲:

    应用程序类加载器 把 扩展类加载器视为双亲,并不是extends关系,而是用组合的方式
    应用程序类加载器中有一个属性parent,它的值是扩展类加载器,当调用getParent()方法时得到的是扩展类加载器
    扩展类加载器 把 引导类加载器视为双亲
    
  3. 双亲委托模式:

    1.当需要加载一个类时,加载顺序为AppCLassLoader --> ExtensionClassLoader --> BootstapClassLoader;
    2.首先由AppCLassLoader 去加载,但是此时他不会马上加载这个类,而是将加载请求委派给他的父类加载器ExtensionClassLoader,看ExtensionClassLoader 是否已加载该类;
    3.当ExtensionClassLoader 未加载时,他也不会立刻加载该类,而是继续委派给他的父类加载器 BootstapClassLoader,查看BootstapClassLoader是否已经加载了该类;
    4.当BootstapClassLoader未加载,他会首先尝试加载这个类,加载时会从自己负责的类库中去尝试加载该类(例如在$JAVA_HOME/jre/lib里未查找到该class),加载失败让ExtensionClassLoader 加载;
    5.ExtensionClassLoader 会在其负责加载的类库中尝试加载,加载失败让AppCLassLoader加载;
    6.当AppCLassLoader加载失败时,会出现CLassNotFundException
    
  4. 双亲委托模式的优点:

防止内存中出现多份同样的字节码(安全性角度)
比如加载位于 rt.jar 包中的类 java.lang.Object,不管是哪个加载器加载这个类,最终都是委托给顶层的启动类加载器进行加载,这样就保证了使用不同的类加载器最终得到的都是同样一个 Object对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值