java 中的类加载器

-------------- Android 进阶解密笔记—类加载器 -------------------------

ClassLoader的类型(两种)
  • 系统类加载器
  • 自定义类加载器
系统类加载器(三种)
  • Bootstrap ClassLoader (引导类加载器)
  • Extensions ClassLoader (拓展类加载器)
  • Application ClassLoader (应用程序类加载器)
Bootstrap ClassLoader (引导类加载器)

C/C++ 代码实现的加载器,用于加载指定的JDK 的核心类库,用来加载以下目录类库

  • $JAVA_HOME/jre/lib 目录
  • Xbootclasspath 参数指定的目录
Extensions ClassLoader (拓展类加载器)

JAVA 中的实现类为ExtClassLoader ,因此可以简称为ExtClassLoader,它用于加载java的拓展类,提供除了系统类之外的额外功能,ExtClassLoader用来加载一下目录中的类库

  • 加载 $JAVA_HOME/jre/lib/ext 目录
  • 系统属性java.ext.dir 所指定的目录
Application ClassLoader (应用程序类加载器)

java 中的实现类为AppClassLoader,因此可以简称为AppClassLoader,同时它又可以称作System ClassLoader(系统类加载器),这是因为AppClassLoader可以通过ClassLoader的getSystemClassLoader方法获取到,它用来加载一下目录中的类库

  • 当前程序的Classpath 目录
  • 系统属性java.class.path 指定的目录
Custom ClassLoader(自定义类加载器)

除了系统提供的类加载器,还可以自定义类加载器,自定义类加载器通过集成java.lang.ClassLoader 类的方式来实现自己的类加载器,Extensions ClassLoader 和 AppClassLoader 也继承了java.lang.ClassLoader类

ClassLoader 继承关系

先看张结果图
在这里插入图片描述

  • ClassLoader 是一个抽象类,其中定义了ClassLoader的主要功能
  • SecureClassLoader 继承了抽象类ClassLoader ,但SecureClassLoader并不是ClassLoader的实现类,而是拓展了ClassLoader类加入了权限方面的功能,加强了ClassLoader 的安全性
  • URLClassLoader 继承自SecureClassLoader,可以通过URL路径从jar文件和文件夹中加载类和资源
  • ExtClassLoader 和 AppClassLoader 继承自 URLClassLoader,他们都是Launcher 的内部类,Launcher是java虚拟机的入口应用,ExtClassLoader和 AppClassLoader 都是在Launcher 中进行初始化的
双亲委托模式

类加载器查找Class 所采用的是双亲委托模式,所谓双亲委托模式就是:

  • 首先判断该类是否被加载
  • 如果没有则不是自身去查找而是委托给父加载器进行查找
  • 直到委托到最顶层的Bootstrap ClassLoader ,如果Bootstrap ClassLoader 找到了该类,就直接返回
  • 如果没有找到,则继续一次向下查找
  • 如果还没找到则最后会交个自身去查找

在这里插入图片描述

虚线的方向自下而 上进行委托,再沿着实线的方向自上而下进行查找和加载

双亲委托模式好处:
  • 避免重复加载,如果已经加载过一次Class,就不需要再次加载,而是直接读取已经加载的Class
  • 更加安全,如果不使用双亲委托模式,就可以自定义一个String类来替代系统的String 类,这显然会造成安全隐患,采用双亲委托模式会使得系统的String类在java虚拟机启动时就被加载,也就无法自定义String类来代替系统的Sting 类,除非我们修改类加载器搜索类的默认算法,还有一点,只有两个类名一致并且并且被同一个类加载器加载的类,java虚拟机才会认为他们时同一个类
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值