Java的类加载机制
常见的类加载器
AppClassLoader
面向用户的类加载器,用来加载我们编写的类以及三方jar包
ExtClassLoader
用来加载系统属性配置的文件
BootstrapClassLoader
使用C/C++编写,属于虚拟机的一部分
自定义ClassLoader
可以用来加载外部路径下的文件
双亲委托机制
所谓双亲委派模式就是,当类加载器收到加载类或资源的请求时,通常都是先委托给父类加载器加载,只有当父类加载器找不到指定类或资源时,自身才会执行实际的类加载过程。 注意,这里的父类加载器不是指子类加载器与父类加载器存在继承关系,可以理解为一种先后执行的顺序。
双亲委派模式是Java推荐的机制,非强制。 自定义类加载器时,如果想保持双亲委派模型,应该重写findClass(name)方法;如果不想保持双亲委派模型,可以重写loadClass(name)方法。
类加载的作用
对于Jvm而言,类加载器的主要作用就是加载Java 类的字节码( .class 文件)到JVM 中(在内存中生成一个代表该类的 Class 对象) 。
Android的类加载机制
常见的类加载器
BootClassLoader
Android系统启动时通过Zygote进程创建Jvm虚拟机后,Jvm虚拟机会使用BootClassLoader来预加载类
DexClassLoader
- dexPath:此参数指定包含类和资源的jar/apk文件列表
- optimizedDirectory:此参数自API级别26起已被弃用,并且不再起作用。在较早的Android版本中,用于存储dex文件的优化版本。
- librarySearchPath:此参数指定包含本地库的目录列表。路径由File.pathSeparator分隔。如果没有需要加载的本地库,则此参数可以为null。
- parent:此参数指定当前ClassLoader的父ClassLoader。当需要加载类或资源时,父ClassLoader用于委派。
PathClassLoader
public PathClassLoader(String dexPath, ClassLoader parent) {
super(dexPath, null, null, parent);
}
public PathClassLoader(String dexPath, String librarySearchPath, ClassLoader parent) {
super(dexPath, null, librarySearchPath, parent);
}
- dexPath: 包含类和资源的jar/apk文件列表,由File.pathSeparator分隔,默认情况下在Android上为":"
- librarySearchPath - 包含本地库的目录列表,由File.pathSeparator分隔;可以为null
- parent:父类加载器