插件化-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都使用的是双亲代理模式也叫双亲委托模式。
其实这个双亲委托模式意思就是说先交给父类的加载器去加载,父类搞不定再自己加载。
####双亲代理模式的作用:
#####共享功能:同一个类只会被加载一次,避免重复加载,只要父classloader加载了类,子classloader就不会再次加载。
#####隔离功能:只要是不同的classloader加载的类,就认为是不同的类,即使包名和类名都一样。这样可以避免用户写一些类冒充java核心类库,导致安全性上的问题。
具体的加载流程:
1、自底向上的检查:
类加载的时候首先委托给自己的父类去加载,如果父类还有父类就继续向上委托,直到交给BootClassLoader,然后BootClassLoader开始判断自己是否加载过,如果没有就交给子类去加载,以此类推,如果都没有加载过,再交给自定义的classloader去加载。
一句话总结就是:先委托父类加载后交给子类的加载模式
以上就是ClassLoader和双亲代理模式的简单的介绍啦(▽)。