类装载器与双亲委派机制

##什么是类加载器

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中来加载类,可用于动态加载。
您的一份奖励,就是我的一份激励