Java类加载器
类加载器可以分为三类:
启动类加载器(Bootstrap ClassLoader):负责加载\lib目录下或者被-Xbootclasspath参数所指定的路径的,并且是被虚拟机所识别的库到内存中。
扩展类加载器(Extension ClassLoader):负责加载\lib\ext目录下或者被java.ext.dirs系统变量所指定的路径的所有类库到内存中。
应用类加载器(Application ClassLoader):负责加载用户类路径上的指定类库,如果应用程序中没有实现自己的类加载器,一般就是这个类加载器去加载应用程序中的类库。
类加载器的双亲委派模型,原理如下:
如果一个类加载器收到了加载类的请求,它不会自己立即去加载类,它会先去请求父类加载器,每个层次的类加载器都是如此。层层传递,直到传递到最高层的类加载器,只有当 父类加载器反馈自己无法加载这个类,才会有当前子类加载器去加载该类
流程图如下
类加载器的双亲委派模型Android虚拟机类加载机制
Java虚拟机加载的是class文件,而Android虚拟机加载的是dex文件(多个class文件合并而成)
Android类加载器类图如下所示:
可以看到Android类加载器的基类是BaseDexClassLoader,它有派生出两个子类加载器:
PathClassLoader: 主要用于系统和app的类加载器,其中optimizedDirectory为null, 采用默认目录/data/dalvik-cache/
DexClassLoader: 可以从包含classes.dex的jar或者apk中,加载类的类加载器, 可用于执行动态加载, 但必须是app私有可写目录来缓存odex文件. 能够加载系统没有安装的apk或者jar文件,
网友评论