赞
踩
JAVA程序被编译器编译之后称为字节码文件(.class文件),当程序需要某个类时,虚拟机便会将对应的class文件进行加载,通过classLoader类加载器加载到虚拟机内存的过程,就是类加载。
熟悉类加载机制流程之前,先熟悉下Android运行流程,以及dex生成的原因。
原因:
为了解决方法数65536的限制和LinearAlloc的限制从而生成了dex打包方案,打包时将代码分成多个dex,将应用启动时必须用到的类和和这些类的直接引用放到主dex中,其他代码放到次dex中,当应用启动时先加载主dex,待到应用启动后再动态的加载次dex。
类从被加载到JVM虚拟机内存到被卸载,整个完整的生命周期包括:类加载 --> 验证 --> 准备 --> 解析 --> 初始化 --> 使用 --> 卸载 七个阶段,其中验证、准备、解析这三个部分统称为连接。
注:类加载流程比较复杂,虽然加载过程有复杂的五个步骤,但是除了加载以外,其他四部都是由JVM虚拟机控制的
注意:初始化不会马上执行,当一个类被主动使用的时候才会去初始化,主要有几种情况:
1)当创建某个类的新实例时(如通过new或者反射等);
2)当调用某个类的静态方法时;
3)当使用某个类或接口的静态字段时;
4)当调用Java API中的某些反射方法时,比如类Class中的方法,或者java.lang.reflect中的类的方法时;
5)当初始化某个子类时;
类加载进内存后,Android程序通过ClassLoader类去加载内存中的类,然后进行解析运行。
Android中包含以下几种类加载器:
BaseDexClassLoader为核心类。常用的ClassLoade就两个:DexClassLoader 和 PathClassLoader。
以下为关联到的知识点:
当加载一个类时,会优先使用父类加载器加载,当父类加载器无法加载时才会使用子类加载器去加载。这么做的目的是为了避免类的重复加载
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。