介绍热加载之前,首先要介绍一下类加载的机制:
类加载通过classloader实现,android中默认使用pathclassloader作为加载器(继承BaseDexClassloder并重写了其findclass()方法),
而BaseDexClassloder中的findcalss()方法使用new出来的DexPathList对象的findclass()方法,作为真正的实现方法。
DexPathList中的构造函数初始化了dexElements,通过其findclass方法遍历dexElements列表,通过DexPathList中的loadclassBinaryName()来进行类的加载。
所以,可以看出,DexPathList对象中的dexElements列表是热加载的核心。一个类要想加载成功,其dex一定在dexElements列表中。所以要保证热加载的dex文件在dexElements列表中。由于这些属性都是私有的,所以需要通过反射机制来将需要热加载的文件插入到dexElements的列表最前边。