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虚拟机才会认为他们时同一个类
发布了33 篇原创文章 · 获赞 5 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/hjiangshujing/article/details/104249791