Java虚拟机类和Android类加载器的机制

77 阅读2分钟

Java的类加载机制

常见的类加载器

image.png

AppClassLoader

面向用户的类加载器,用来加载我们编写的类以及三方jar包

ExtClassLoader

用来加载系统属性配置的文件

BootstrapClassLoader

使用C/C++编写,属于虚拟机的一部分

自定义ClassLoader

可以用来加载外部路径下的文件

双亲委托机制

所谓双亲委派模式就是,当类加载器收到加载类或资源的请求时,通常都是先委托给父类加载器加载,只有当父类加载器找不到指定类或资源时,自身才会执行实际的类加载过程。 注意,这里的父类加载器不是指子类加载器与父类加载器存在继承关系,可以理解为一种先后执行的顺序。

双亲委派模式是Java推荐的机制,非强制。 自定义类加载器时,如果想保持双亲委派模型,应该重写findClass(name)方法;如果不想保持双亲委派模型,可以重写loadClass(name)方法。

类加载的作用

对于Jvm而言,类加载器的主要作用就是加载Java 类的字节码( .class 文件)到JVM 中(在内存中生成一个代表该类的 Class 对象)

Android的类加载机制

常见的类加载器 image.png

BootClassLoader

Android系统启动时通过Zygote进程创建Jvm虚拟机后,Jvm虚拟机会使用BootClassLoader来预加载类

DexClassLoader

image.png

  • 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:父类加载器