插件化学习笔记三:JVM的ClassLoader和DVM的ClassLoader的区别以及加载流程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/baidu_31093133/article/details/82385684

插件化-classloader 双亲代理模式

参考资料:两篇非常好的博客

Android解析ClassLoader(一)Java中的ClassLoader | 刘望舒的博客
http://liuwangshu.cn/application/classloader/1-java-classloader-.html

热修复入门:Android 中的 ClassLoader - 简书
https://www.jianshu.com/p/96a72d1a7974

JVM中的ClassLoader:
类名(由顶向下) 作用
Bootstrap ClassLoader 加载Jre/lib/目录下的jar包或者启动Java虚拟机时-Xbootclasspath选项指定的目录。主要是一些系统类
Extension ClassLoader 加载Jre/lib/ext/目录下的jar包或者加载java虚拟机启动时通过-Djava.ext.dirs选项指定的目录下的jar包。主要是一些java扩展类。
App ClassLoader 加载CLASSPATH目录下的所有jar和Class文件,也可以加载通过-Djava.class.path选项所指定的目录下的jar和Class文件。主要是自己的应用程序写的类。
Custom ClassLoader 通过自定义java.lang.ClassLoader的子类加载class
DVM中的ClassLoader

JVM中加载的是class文件,而DVM中加载的是dex文件,由于加载的文件类型不同,所以ClassLoder的逻辑也不同。
DVM中的ClassLoader同样分为系统的ClassLoader和自定义的ClassLoader。
系统的ClassLoader包含:BootClassLoader,PathClassLoader,DexClassLoader

类名(由顶向下) 作用
BootClassLoader Android系统启动时会使用BootClassLoader来预加载常用类,与Java中的BootClassLoader不同,它并不是由C/C++代码实现,而是由Java实现的。
PathClassLoader Android系统使用PathClassLoader来加载系统类和应用程序的类
DexClassLoader DexClassLoader可以加载dex文件以及包含dex的压缩文件(apk和jar文件),不管是加载哪种文件,最终都是要加载dex文件

不管是JVM还是DVM的ClassLoader都使用的是双亲代理模式也叫双亲委托模式。

双亲代理模式的特点:

  1. 自底向上检查类是否已经加载:
    加载一个类前先看子类是否已经加载过,如果没有加载过,则看父classloader是否加载过。如果一直查到bootstrap classloader还是没有找到这个类,则再向下查找并尝试加载。

  2. 自顶向下尝试加载类:
    如果父类已经加载过类,则子类不再加载。

双亲代理模式的作用:

共享功能:同一个类只会被加载一次,避免重复加载,只要父classloader加载了类,子classloader就不会再次加载。
隔离功能:只要是不同的classloader加载的类,就认为是不同的类,即使包名和类名都一样。这样可以避免用户写一些类冒充java核心类库,导致安全性上的问题。

具体的加载流程:
1、自底向上的检查:
自定义的 ClassLoader 先检查当前Class 是否已加载,如果已加载,则直接返回该Class,如果没有加载则委托给父类加载器检查是否加载过该Class,如果已加载,则直接返回该Class,如果还是没有则委托给父类的父类(祖父类)检查是否已经加载过该类,依此类推,这个过程就是自底向上的检查类的加载。

2、如果一直到BootstrapClassLoader检查发现已经加载了这个类,则返回该Class,如果检查发现仍然没有加载过这个类,就会尝试从传入的路径下加载该类。如果加载成功,则直接返回 Class,如果加载失败,则委托给子类尝试加载。依此类推,直到自定义的ClassLoader尝试加载这个类,如果自定义的类加载成功则返回该Class,如果失败则抛出异常。这个过程就是自顶向下的尝试加载类。

以上就是ClassLoader和双亲代理模式的简单的介绍啦(^▽^)。

猜你喜欢

转载自blog.csdn.net/baidu_31093133/article/details/82385684