一.Android中有哪几种ClassLoader?它们的作用和区别是什么?
BootClassLoader加载Android Framework层的字节码文件;
PathClassLoader加载已经安装到系统中的apk文件中的字节码文件;
DexClassLoader加载没有安装到系统中的apk,jar文件中的字节码文件;
在android中,ClassLoader关系如上图
BaseDexClassLoader是PathClassLoader和DexClassLoader的父类,真正实现功能的代码都在BaseDexClassLoader中
二.简述ClassLoader的双亲委托模型
当类加载器收到加载类或资源请求时,通常都是先委托给父类加载器加载,当父类加载器找不到指定类或者资源时,自身才会执行实际的类加载过程,具体加载过程如下:
1.先去判断源ClassLoader是否已加载目标类
2.再去判断父ClassLoader是否加载过目标类
3.如果都没有再去真正加载这个类,调用findClass这个方法
双亲委托模型具有共享性和隔离性,共享是指一次加载,一起使用;隔离是指父ClassLoader加载过了,子ClassLoader不会再去加载,保证不会被串改。
三.简述双亲委托模型在热修复领域的应用
一种简单的热修复方案:假设代码中有某个类或者几个类有bug,在修复完代码之后,可以将这些类打包成一个补丁文件,通过这个补丁文件封装成一个Element对象,并且将这个Element对象插入到原dexElements数组的最前端,这样当DexClassLoader去加载类时,优先会从我们插入的这个Element中找到相应的类,虽然那个有bug的类还存在于数值中后面的Element中,但由于双亲加载机制的特点,这个有bug的类已经没有机会被加载了,这样有bug就在没有重新安装应用的情况下修复了。