Android ClassLoader

Android ClassLoader_第1张图片


J


Java的类加载器一般为URLClassLoader,在Android里是不能用的,取而代之的是DexClassLoader和PathClassLoader。


Android 中的类加载器大致可以分成两类,一类是系统提供的,另外一类则是由 Java 应用开发人员编写的。


系统提供的类加载器主要有下面三个:

1,引导类加载器(java.lang.BootClassLoader instance):它用来加载 Java 的核心库,是由虚拟机提供的,并不继承自 java.lang.ClassLoader。

2,系统类加载器(dalvik.system.PathClassLoader instance):它用来加载 Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类. 

在 android中,它的DexPathList 默认是 ".", 即启动 dalvik  vm的目录, 

nativeLibraryDirectories 是 [/vendor/lib , /system/lib]; 可以通过 ClassLoader.getSystemClassLoader()来获取它。

3,应用类加载器(dalvik.system.PathClassLoader instance):它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的。它的 DexPathList 是 "/data/app/your_package_file_name.apk", 

nativeLibraryDirectories 则为 [/data/app-lib/your_package_file_name, /vendor/lib, /system/lib]”

如果在一个 Activity 中执行如下代码:

this.getClassLoader()

//或者 任何一个普通 POJO 比如 param ,执行:
//param.getClass().getClassLoader()

都会得到类似如下的结果:

result = {dalvik.system.PathClassLoader@5453543} "dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.zzw.october.debug-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.zzw.october.debug-1, /vendor/lib, /system/lib]]]"
pathList = {dalvik.system.DexPathList@4324325} "DexPathList[[zip file "/data/app/com.zzw.october.debug-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.zzw.october.debug-1, /vendor/lib, /system/lib]]”
parent= {java.lang.BootClassLoader@6745984}



Java 应用开发人员编写和使用的则主要是 DexClassLoader 以及其他继承至ClassLoader的类。


你可能感兴趣的:(Android ClassLoader)