网站制作的服务商,私人定制网站建设,长春市长春网站建设,购物网站开发费用1.Java中的 ClassLoader
1.1 、ClassLoader的类型 Java 中的类加载器主要有两种类型#xff0c;即系统类加载器和自定义类加载器。其中系统类 加载器包括3种#xff0c;分别是 Bootstrap ClassLoader、Extensions ClassLoader 和 Application ClassLoader。
1.1.1.Bootstra…1.Java中的 ClassLoader
1.1 、ClassLoader的类型 Java 中的类加载器主要有两种类型即系统类加载器和自定义类加载器。其中系统类 加载器包括3种分别是 Bootstrap ClassLoader、Extensions ClassLoader 和 Application ClassLoader。
1.1.1.Bootstrap ClassLoader (引导类加载器 C/C代码实现的加载器用于加载指定的JDK的核心类库比如java.lang、java.uti.等这些系统类。它用来加载以下目录中的类库
$JAVA_HOME/jre/lib目录-Xbootclasspath 参数指定的目录 Java虚拟机的启动就是通过 Bootstrap ClassLoader 创建一个初始类来完成的。由于Bootstrap ClassLoader 是使用 C/C语言实现的所以该加载器不能被 Java代码访问到。
1.1.2.Extensions ClassLoader(拓展类加载器) Java 中的实现类为 ExtClassLoader因此可以简称为 ExtClassLoader它用于加载Java的拓展类提供除了系统类之外的额外功能。ExtClassLoader 用来加载以下目录中的类库
加载$JAVA_HOME/jre/lib/ext目录系统属性java.ext.dir 所指定的目录
1.1.3.Application ClassLoader (应用程序类加载器) Java 中的实现类为AppClassLoader因此可以简称为 AppClassLoader同时它又可以称作 System ClassLoader (系统类加载器)这是因为AppClassLoader 可以通过 ClassLoader的getSystemClassLoader 方法获取到。它用来加载以下目录中的类库
当前程序的Classpath目录。系统属性java.classpath 指定的目录。
1.1.4.Custom ClassLoader (自定义类加载器) 除了系统提供的类加载器还可以自定义类加载器自定义类加载器通过继承java.lang.ClassLoader 类的方式来实现自己的类加载器Extensions ClassLoader 和 App ClassLoader也继承了java.lang.ClassLoader 类。
1.1.5.ClassLoader 继承关系图 2.Android中的 ClassLoader
2.1. ClassLoader的类型 Java 中的 ClassLoader 可以加载jar 文件和 Class 文件 (本质是加载CIass文件)这一点在Android中并不适用因为无论是 DVM还是ART它们加载的不再是 Class文件而是 dex 文件。 Android 中的 ClassLoader 类型和Java 中的ClassLoader 类型类似也分为两种类型 分别是系统类加载器和自定义加载器。其中系统类加载器主要包括 3 种分别是 BootClassLoader、 PathClassLoader 和 DexClassLoader。
2.1.1. BootClassLoader Android 系统启动时会使用 BootClassLoader 来预加载常用类与SDK 中的 Bootstrap ClassLoader 不同它并不是由 C/C代码实现的而是由 Java 实现的。
2.1.2. DexClassLoader DexClassLoader 可以加载 dex 文件以及包含 dex的压缩文件(apk 和jar 文件)不管加 载哪种文件最终都要加载 dex 文件。
2.1.3. PathClassLoader Android 系统使用 PathClassLoader 来加载系统类和应用程序的类。PathClassLoader 默认了参数 optimizedDirectory 的值为/data/dalvik-cache很显然 PathClassLoader 无法 定义解压的dex文件存储路径因此 PathClassLoader 通常用来加载已经安装的apk的dex 文件(安装的apk的dex 文件会存储在/data/dalvik-cache 中)。
2.1.4. ClassLoader 继承关系图
ClassLoader 是一个抽象类其中定义了 ClassLoader 的主要功能。BootClassLoader是它的内部类。SecureClassLoader 类和JDK8中的 SecureClassLoader 类的代码是一样的它继承了抽象类 ClassLoader。SecureClassLoader 并不是 CassLoader 的实现类而是拓展了ClassLoader类加人了权限方面的功能加强了ClassLoader 的安全性。URLClassLoader 类和JDK8中的URLCIssLoader 类的代码是一样的它继承自SecureClassLoader用来通过URL路径从jar 文件和文件夹中加载类和资源。InMemoryDexClassLoader 是 Android 8.0新增的类加载器继承自BaseDexClassLoader用于加载内存中的dex 文件。BaseDexClassLoader 继承自 ClassLoader是抽象类 ClassLoader 的具体实现类PathClassLoader、DexClassLoader 和InMemoryDexClassLoader 都继承自它。
2.2 ClassLoader的加载过程
2.2.1. BootClassLoader的加载过程 BootClassLoader 是在 Zygote进程的 ZygoteInit的入口方法main中被创建的用于加载preloaded-classes 文件中存有的预加载类。预加载属于拿空间换时间的策略Zygote 环境配置得越健全越通用应用程序进程需要单独做的事情也就越少预加载除了预加载类还有预加载资源和预加载共享库。
一些预加载类如下图所示 2.2.2. PathClassLoader的加载过程 PathClassLoader 是在SystemServer 进程中采用工厂模式创建的。
3.双亲委托模式 类加载器查找 Class 所采用的是双亲委托模式所谓双亲委托模式就是首先判断该Class 是否已经加载如果没有则不是自身去查找而是委托给父加载器进行查找这样依次进行递归直到委托到最顶层的 Bootstrap ClassLoader如果 Bootstrap ClassLoader 找到了该 Class就会直接返回如果没找到则继续依次向下查找如果还没找到则最后会交由自身去查找。
通俗的讲就是你要找一件玩具你找不到就问你父亲有没有见过这个玩具是否已经加载你父亲没见过就问你父亲的父亲有没有见过一直往上问如果谁见过就把玩具找出来给你。如果最大的老父亲还是没见过他就帮你找找不到他就歇下了叫儿子帮忙找一直往下找到就给你没找到你就自己找。
4.Java中的ClassLoader与Android中ClassLoader的区别
Java的引导类加载器是由C编写的,Android中的引导类加载器则是用Java编写的。由于Android 中加载的不再是 Class 文件因此Android 中没有 ExtClassLoader和AppClassLoader替代它们的是 PathClassLoader和 DexClassLoader。