为了更好地理解Android中的ClassLoader,会先介绍Java中的ClassLoader,之后,再介绍Android的。

Java中的ClassLoader

  1. ClassLoader的类型
  • Java中的类加载器主要有两种类型,即系统类加载器和自定义类加载器。而系统类加载器包括3种,分别是Bootstrap ClassLoader(C++实现)、Extensions ClassLoader和Application ClassLoader。下面看一下ClassLoader的继承关系:
    Android再进阶之ClassLoader介绍

对五个相关的ClassLoader类进行介绍:

  • ClassLoader是一个抽象类,其中定义了ClassLoader的主要功能。
  • SecureClassLoader继承了抽象类ClassLoader,但SecureClassLoader并不是ClassLoader的实现类,而是拓展了ClassLoader类加入了权限方面的功能,加强了ClassLoader的安全性。
  • URLClassLoader继承自SecureClassLoader,可以通过URL路径从jar文件和文件夹中加载类和资源。
  • ExtClassLoader和AppClassLoader都继承自URLClassLoader,它们都是Launcher的内部类,Launcher是Java虚拟机的入口应用,ExClassLoader和AppClassLoader都是在Launcher中进行初始化的。
  1. 双亲委托模式
  • 所谓的双亲委托模式就是:在开始的在缓存中查找Class是否已经加载,会从下向上进行委托,而如果没有加载,就又会自上向下进行类的源的查找。如下:
    Android再进阶之ClassLoader介绍

采用双亲委托模式好处如下:

  • 避免重复加载,如果已经加载一次就不需要重复加载了。
  • 更加安全。如果,不采用这种方式,那么,是不是自定义的String类就会代替系统的String类呢?
  1. 自定义ClassLoader
  • 定义一个自定义ClassLoader并继承抽象类ClassLoader。
  • 复写findClass方法,并在findClass方法中调用defineClass方法。

Android的ClassLoader

  1. ClassLoader的类型
  • Android的ClassLoader类型和Java中的ClassLoader类型类似,也分为两种类型,分别是系统加载类和自定义加载类。3种系统加载类:BootClassLoader、PathClassLoader和DexClassLoader。
  • BootClassLoader。Android系统启动的时候,会启用BootClassLoader来预加载常用类,它不是C++实现的,它是ClassLoader的内部类,继承自ClassLoader,是一个单例类应用程序中无法直接访问。
  • DexClassLoader。加载dex文件以及包含dex的压缩文件。
  • PathClassLoader。它被Android系统用来加载系统的类和应用程序的类。

2.ClassLoader的继承关系

  • 如下:
    Android再进阶之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中。

相关文章:

  • 2022-12-23
  • 2021-06-15
  • 2022-12-23
  • 2021-09-12
  • 2021-08-24
  • 2021-04-10
  • 2021-11-04
  • 2022-12-23
猜你喜欢
  • 2021-10-20
  • 2021-06-06
  • 2021-09-28
  • 2022-01-10
  • 2022-12-23
  • 2022-12-23
  • 2021-11-13
相关资源
相似解决方案