插件化介绍三:JVM的ClassLoader和DVM的ClassLoader的区别以及加载流程

插件化-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

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

不管是JVM还是DVM的ClassLoader都使用的是双亲代理模式也叫双亲委托模式。
其实这个双亲委托模式意思就是说先交给父类的加载器去加载,父类搞不定再自己加载。

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

具体的加载流程:
1、自底向上的检查:
类加载的时候首先委托给自己的父类去加载,如果父类还有父类就继续向上委托,直到交给BootClassLoader,然后BootClassLoader开始判断自己是否加载过,如果没有就交给子类去加载,以此类推,如果都没有加载过,再交给自定义的classloader去加载。

一句话总结就是:先委托父类加载后交给子类的加载模式

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值