##什么是类加载器
Java虚拟机类加载过程是把Class类文件加载到内存,并对Class文件中的数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的java类型的过程。
在Java中,任意一个类都需要由加载它的类加载器和这个类本身一同确定其在java虚拟机中的唯一性,即比较两个类是否相等,只有在这两个类是由同一个类加载器加载的前提之下才有意义,否则,即使这两个类来源于同一个Class类文件,只要加载它的类加载器不相同,那么这两个类必定不相等(这里的相等包括代表类的Class对象的equals()方法、isAssignableFrom()方法、isInstance()方法和instanceof关键字的结果)。
##java虚拟机加载器的种类
- BootstrapClassLoader(启动类加载器)是Java虚拟机的一部分,用来加载JAVA_Home/lib目录下的类库
- ExtensionClassLoader(标准扩展类加载器)用来加载JAVA_Home/lib/ext目录下的类库
- ApplicationClassLoader(系统类加载器)将系统类路径(CLASS_PATH)中的类库加载到内存中去
- 除此之外还有自定义类加载器,他们之间的除了顶层的BootStrapClassLoder,其他加载器都应该指明他的父加载器,父加载器和其应该是一种组合关系。
##双亲委派模型
指某一个加载器在接收到加载类的请求时,首先将加载任务委托给父加载器,依次递归,如果父加载器能够加载则直接返回,只有父加载器都无法加载的情况下才由自己加载。这样做的目的在于防止类加载再次将一个已经存在的Class加载进去。
##Android中的类加载器
- BootClassLoader:BootClassLoader 的实例在Android启动的时候创建,用来加载Android系统框架类库
- PathClassLoader:在应用启动的时候创建该类加载器实例,只能加载本地的列表文件或目录,在Android中也就是已安装好的APK,它不能加载来自网络的类。
- DexClassLoader::可以从包含dex文件的JAR或APK中来加载类,可用于动态加载。