美文网首页
ClassLoader笔记

ClassLoader笔记

作者: zifary | 来源:发表于2018-03-10 19:00 被阅读10次

    Android中ClassLoader种类,作用和区别

    1、BootClassLoader,单纯的ClassLoader类,虚拟机内置的类加载器,作为所有加载器的root parent。
    2、PathDexClassLoader,ClassLoader子类,访问本地文件系统里的文件列表,用作加载Android系统以及已经安装过的apk文件列表里的类,无法从网络中加载类。
    3、DexClassLoader,也是ClassLoader子类,能加载未安装的jar/apk/dex文件里的类,可以用作热更新动态加载补丁dex
    4、InMemoryDexClassLoader,API 26添加,可以从包含dex文件的缓冲区加载类,可以执行那些还没被加载到本地文件系统里的代码。

    ClassLoader的双亲委托

    1、ClassLoader通过双亲委托机制来加载类,加载某个类时,这个类的ClassLoader(源ClassLoader)先判断有没有加载过该类,如果已经加载过,直接返回Class;如果没有,则委托ClassLoader的父ClassLoader来加载。如果还是没有,则一直往上到最上层父祖类BootClassLoader,如果BootClassLoader也没有加载过,那么就开始在其对应类的路径下寻找class字节码文件并载入,载入成功后返回Class;如果载入失败,则开始委托给子类加载器去载入文件中的class字节码,不成功则依次委托给子类的子类加载器...直到源ClassLoader,源ClassLoader如果也载入失败了,就结束加载,抛出异常。
    一句话总结:
    由子类往父类的findClass流程,以及由父类往子类方向的loadClass流程,一旦成功,流程便会终止并返回Class,失败则会尝试到底。

    双亲委托在热修复领域的应用

    系统在加载类前,会将所有的dex文件都整理成一个Element数组dexElement,热修复将补丁dex放在dexElement数组最前面,这样会优先加载补丁中dex里面的类,依从双亲委托机制,已经加载过后,不会重复加载,这样就达到了修复作用。

    相关文章

      网友评论

          本文标题:ClassLoader笔记

          本文链接:https://www.haomeiwen.com/subject/llybfftx.html