Android类加载
Android类加载机制Android类加载机制的核心是将class文件映射为内存中的class对象。类加载机制是热修复技术的基础。面试常见考点包括双亲委派机制及其作用PathClassLoader与DexClassLoader的功能差异类初始化的触发条件静态方法为何不能调用非静态变量1.双亲委派1) 双亲委派的概念双亲委派机制源于JVMAndroid的Dalvik/ART虚拟机基于JVM改造继承了该机制。类加载流程如下ClassLoader加载class文件时首先检查自身是否已加载若未加载则委托父加载器处理父加载器重复相同逻辑直至顶级加载器无父加载器顶级加载器尝试加载失败后逐级回退至调用者完成加载2) 双亲委派的实现实现原理类加载器必须关联父对象未显式指定时默认使用PathClassLoader作为父加载器层级关系BootClassLoader顶级→PathClassLoader→自定义ClassLoader核心方法loadClass调用findLoadedClass检查已加载记录存在父加载器则递归调用parent.loadClass顶级加载器调用findClass尝试加载失败后向下传递流程示例步骤加载器行为1CustomClassLoader检查自身缓存2委托PathClassLoader处理3PathClassLoader委托BootClassLoader处理4BootClassLoader尝试加载失败后回退3) 双亲委派的作用核心作用避免重复加载确保同一class文件仅被加载一次保证类唯一性类在虚拟机中的标识由加载器全限定名共同决定防止核心类篡改系统类优先由顶级加载器加载4) Android中主要的类加载器主要类加载器对比类加载器功能特殊性BootClassLoader加载系统预置类不可直接调用PathClassLoader加载已安装APK的dex文件可加载外部存储dex与常见说法不同DexClassLoader加载dex/压缩文件jar/zip- 0后与PathClassLoader实现无实质差异关键实现细节构造参数差异DexClassLoader废弃的optimizedDirectory参数在 - 0后无效dexPath格式支持冒号分隔多路径如path1:path2热修复基础通过修改dexElements数组顺序实现类覆盖类文件加载两个核心问题涉及类加载核心机制Android中Class.forName()与ClassLoader.loadClass()加载类的区别静态方法中无法访问非静态变量的底层原因。1.类加载步骤class文件加载至内存需经历三个阶段装载查找并导入class文件二进制数据流链接包含验证、准备、解析三个子阶段初始化执行类构造器clinit方法1) 装载核心操作根据全限定名查找class文件将二进制数据流导入内存关键产出方法区生成运行时数据结构堆内存生成对应Class对象作用为后续访问类元数据提供入口2) 链接子阶段验证内容典型案例文件格式验证魔数/版本号校验检查字节流是否以0xCAFEBABE开头元数据验证语义规范性检查验证父类存在性、抽象方法实现字节码验证程序逻辑合法性检测危害虚拟机安全的指令准备阶段静态变量内存分配static int value默认赋值为0初始化时机差异静态变量类初始化阶段赋值如static int value3实际赋值在clinit实例变量对象实例化时赋值通过init方法完成3) 解析核心作用将符号引用转换为直接内存地址指针优化效果避免运行时重复解析例如将public static value字段引用替换为固定内存地址4) 初始化触发条件六种new实例化对象访问类静态变量调用类静态方法Class.forName()反射加载初始化子类时触发父类初始化JVM启动类关键区别Class.forName()会触发初始化阶段ClassLoader.loadClass()仅加载类不触发初始化5) 源码分析Class.forName()方法实现路径通过ClassLoader.getCallerClassLoader()获取类加载器参数initializetrue强制触发初始化阶段底层通过ClassLinker::DefineClass完成装载/链接核心特点包含ensureInitialized()调用确保执行clinitClassLoader.loadClass()方法实现差异委托PathClassLoader遍历dex文件查找类最终调用DefineClass但不执行初始化性能优化点将高频类置于dex文件数组首位可加速加载
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2598788.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!