Android系统ClassLoader介绍

2018/09/30 Android

起源

为什么要写这篇博客呢?是因为最近在做热修复的相关功能,其中非常重要的一部分内容就 是关于ClassLoder的内容,这一部分内容也是Android系统中非常重要的一部分内容。

ClassLoader简介

Java程序的本质就是JVM执行编译好的Class文件,Android虚拟机在本质上和JVM是一致的。 所以我们理解了JVM的ClassLoader也就理解了Android端的ClassLoder机制。ClassLoder的 作用简单来说就是加载class文件,然后提供给程序运行时使用。

ClassLoader的双亲委派机制

双亲委派机制核心思想就是“找事找我爹”,当类加载器(ClassLoder)收到加载类 (class)或者资源的请求时,首先会先委托给弗雷加载器进行加载,以此类推。只有当自 己的父加载器也找不到指定类或资源时,自己才会执行时间的类加载过程。

具体的过程如下所示:

  1. 源ClassLoader先判断该Class是否已加载,如果已加载,则直接返回Class,如果没有则 委托给父类加载器。
  2. 父类加载器判断是否加载过该Class,如果已加载,则直接返回Class,如果没有则委托 给祖父类加载器。
  3. 依此类推,直到始祖类加载器(引用类加载器)。
  4. 始祖类加载器判断是否加载过该Class,如果已加载,则直接返回Class,如果没有则 尝试从其对应的类路径下寻找class字节码文件并载入。如果载入成功,则直接返回 Class,如果载入失败,则委托给始祖类加载器的子类加载器。
  5. 始祖类加载器的子类加载器尝试从其对应的类路径下寻找 class 字节码文件并载入。如 果载入成功,则直接返回Class,如果载入失败,则委托给始祖类加载器的孙类加载器。
  6. 依此类推,直到源ClassLoader。
  7. 源ClassLoader尝试从其对应的类路径下寻找class字节码文件并载入。如果载入成功, 则直接返回Class,如果载入失败,源ClassLoader 不会再委托其子类加载器,而是抛出 异常。

Android 中的ClassLoder

Search

    Table of Contents