类加载的原理

Java类加载器

类加载器可以分为三类:

启动类加载器(Bootstrap ClassLoader):负责加载\lib目录下或者被-Xbootclasspath参数所指定的路径的,并且是被虚拟机所识别的库到内存中。

扩展类加载器(Extension ClassLoader):负责加载\lib\ext目录下或者被java.ext.dirs系统变量所指定的路径的所有类库到内存中。

应用类加载器(Application ClassLoader):负责加载用户类路径上的指定类库,如果应用程序中没有实现自己的类加载器,一般就是这个类加载器去加载应用程序中的类库。

类加载器的双亲委派模型,原理如下:

如果一个类加载器收到了加载类的请求,它不会自己立即去加载类,它会先去请求父类加载器,每个层次的类加载器都是如此。层层传递,直到传递到最高层的类加载器,只有当 父类加载器反馈自己无法加载这个类,才会有当前子类加载器去加载该类

流程图如下

类加载的原理_第1张图片
类加载器的双亲委派模型

Android虚拟机类加载机制
Java虚拟机加载的是class文件,而Android虚拟机加载的是dex文件(多个class文件合并而成)
Android类加载器类图如下所示:

类加载的原理_第2张图片
Android类加载器类图

可以看到Android类加载器的基类是BaseDexClassLoader,它有派生出两个子类加载器:

PathClassLoader: 主要用于系统和app的类加载器,其中optimizedDirectory为null, 采用默认目录/data/dalvik-cache/

DexClassLoader: 可以从包含classes.dex的jar或者apk中,加载类的类加载器, 可用于执行动态加载, 但必须是app私有可写目录来缓存odex文件. 能够加载系统没有安装的apk或者jar文件,

参考: Android虚拟机框架:类加载机制

你可能感兴趣的:(类加载的原理)