为了更好地理解Android中的ClassLoader,会先介绍Java中的ClassLoader,之后,再介绍Android的。
Java中的ClassLoader
- ClassLoader的类型
- Java中的类加载器主要有两种类型,即系统类加载器和自定义类加载器。而系统类加载器包括3种,分别是Bootstrap ClassLoader(C++实现)、Extensions ClassLoader和Application ClassLoader。下面看一下ClassLoader的继承关系:
对五个相关的ClassLoader类进行介绍:
- ClassLoader是一个抽象类,其中定义了ClassLoader的主要功能。
- SecureClassLoader继承了抽象类ClassLoader,但SecureClassLoader并不是ClassLoader的实现类,而是拓展了ClassLoader类加入了权限方面的功能,加强了ClassLoader的安全性。
- URLClassLoader继承自SecureClassLoader,可以通过URL路径从jar文件和文件夹中加载类和资源。
- ExtClassLoader和AppClassLoader都继承自URLClassLoader,它们都是Launcher的内部类,Launcher是Java虚拟机的入口应用,ExClassLoader和AppClassLoader都是在Launcher中进行初始化的。
- 双亲委托模式
- 所谓的双亲委托模式就是:在开始的在缓存中查找Class是否已经加载,会从下向上进行委托,而如果没有加载,就又会自上向下进行类的源的查找。如下:
采用双亲委托模式好处如下:
- 避免重复加载,如果已经加载一次就不需要重复加载了。
- 更加安全。如果,不采用这种方式,那么,是不是自定义的String类就会代替系统的String类呢?
- 自定义ClassLoader
- 定义一个自定义ClassLoader并继承抽象类ClassLoader。
- 复写findClass方法,并在findClass方法中调用defineClass方法。
Android的ClassLoader
- ClassLoader的类型
- Android的ClassLoader类型和Java中的ClassLoader类型类似,也分为两种类型,分别是系统加载类和自定义加载类。3种系统加载类:BootClassLoader、PathClassLoader和DexClassLoader。
- BootClassLoader。Android系统启动的时候,会启用BootClassLoader来预加载常用类,它不是C++实现的,它是ClassLoader的内部类,继承自ClassLoader,是一个单例类应用程序中无法直接访问。
- DexClassLoader。加载dex文件以及包含dex的压缩文件。
- PathClassLoader。它被Android系统用来加载系统的类和应用程序的类。
2.ClassLoader的继承关系
- 如下:
8个ClassLoader相关类,下面简单介绍。
- ClassLoader是一个抽象类,其中定义了ClassLoader的主要功能。BootClassLoader是它的内部类。
- SecureClassLoader类和JDK8中的SecureClassLoader类的代码是一样的,它继承了ClassLoader。具体介绍看上面Java那里。
- URLClassLoader也和JDK中的一样,具体介绍看上面Java那里。
- InMemoryDexClassLoader是Android 8.0新增的类加载器,继承自BaseDexClassLoader,用于加载内存中的dex文件。
- BaseDexClassLoader继承自ClassLoader,是抽象类ClassLoader的具体实现类,PathClassLoader、DexClassLoader和InMemoryDexClassLoader都继承自它。
3.ClassLoader的加载过程
- 同样采用双亲委托模式,不再赘述。ClassLoader的加载方法为,loadClass方法,这个方法被定义在抽象类ClassLoader中。