Android 类加载机制

一、分类

类的加载都是通过 ClassLoader 来完成的,根据加载类存放在不同的位置,需要不同的ClassLoader。因此大概可以分为如下几类:

  • Apk 中已经存在的类
  • Apk 未存在的类(插件化实现方式)

针对上述的分类,Android 中有如下的 ClassLoader 实现:

  • PathClassLoader:通常用来加载系统类和应用程序类,加载 Apk 中已经安装的 dex
  • DexClassLoader:加载 dex 文件,可用来加载外部的类,在 Android8.0 之后,和 PathClassLoader 没有区别

二、双亲委托机制实现

机制的流程如下:

  1. 检查这个类是否被加载过,如果加载过,则直接返回
  2. 如果父 ClassLoader 存在,则交给父 ClassLoader 加载,否则交给 BootClassLoader 加载
  3. 如果父 ClassLoader 无法加载,则调用自己的 findClass 完成加载

双亲委托机制的源码如下:(伪代码)

java 复制代码
protected Class<?> loadClass(String name, boolean resolve) {
    synchronized (getClassLoadingLock(name)) {
        // 1. 检查是否曾加载过
        Class<?> c = findLoadedClass(name);
        if (c == null) {
           if (parent != null) {
               // 2. 优先让 parent 加载器去加载
               c = parent.loadClass(name, false);
           } else {
               c = findBootstrapClassOrNull(name);
           }
            if (c == null) {
            	// 3. 如果 parent 均没有加载到目标class,调用自身的 findClass() 方法去搜索
                c = findClass(name);
            }
        }
        return c;
    }
}

为什么使用双亲委托机制:

  • 避免一个类被多次加载
  • 安全,确保系统类 .Class 不被篡改
相关推荐
Mike_jia22 分钟前
🎓 OpenMAIC 终极指南:清华开源的多智能体 AI 互动课堂平台
前端
踩着两条虫26 分钟前
告别低代码“黑盒”!VTJ.PRO 2.0:用AI与自由重塑Vue3开发
前端·低代码·ai编程
OpenTiny社区32 分钟前
WebAgent :基于 MCP 协议打造的智能应用“超级路由器”
前端·agent·mcp
dweizhao1 小时前
别再用 Figma 画线框图了,Google 这款免费工具直接出 UI 稿
前端
han_1 小时前
JavaScript设计模式(五):装饰者模式实现与应用
前端·javascript·设计模式
ProgramHelpOa1 小时前
Amazon SDE Intern OA 2026 最新复盘|70分钟两题 Medium-Hard
java·前端·javascript
smchaopiao2 小时前
如何用CSS和JS搞定全屏图片展示
前端·javascript·css
酉鬼女又兒2 小时前
零基础快速入门前端CSS Transform 与动画核心知识点及蓝桥杯 Web 应用开发考点解析(可用于备赛蓝桥杯Web应用开发)
开发语言·前端·css·职场和发展·蓝桥杯·html
山川行2 小时前
Python快速闯关8:内置函数
java·开发语言·前端·笔记·python·学习·visual studio
徐小夕2 小时前
花了一周时间,我们开源了一款PDF编辑SDK,支持在线批注+脱敏
前端·vue.js·github