ClassLoader

2020-05-28  本文已影响0人  那个阳光下奔跑的少年

双亲委托机制

自己先加载,加载到返回class,加载不到让父类加载,如此往复,最后还是加载不到,抛出异常。

好处

高效:父类加载一次就可以避免子类多次加载
安全:避免伪造java核心类

Android ClassLoader

BootClassLoader
PathClassLoader
源码位置:| /libcore/dalvik/src/main/java/dalvik/system/ |
DexClassLoader
通常网上博客会说PathClassLoader加载apk类,DexClassLoader记载的是自己的dex
我们从源码看一下

6.0源码如下

PathClassLoader源码

public class PathClassLoader extends BaseDexClassLoader {

  public PathClassLoader(String dexPath, ClassLoader parent) {
         super(dexPath, null, null, parent);
}

public PathClassLoader(String dexPath, String libraryPath,
             ClassLoader parent) {
         super(dexPath, null, libraryPath, parent);
}

}

DexClassLoader源码

public class DexClassLoader extends BaseDexClassLoader {

 public DexClassLoader(String dexPath, String optimizedDirectory,
              String libraryPath, ClassLoader parent) {
          super(dexPath, new File(optimizedDirectory), libraryPath, parent);
}

}

BaseDexClassLoader源码

public class BaseDexClassLoader extends ClassLoader {
//可以看到optimizedDirectory是传给了DexPathList
 public BaseDexClassLoader(String dexPath, File optimizedDirectory,
             String libraryPath, ClassLoader parent) {
         super(parent);
          this.pathList = new DexPathList(this, dexPath, libraryPath, optimizedDirectory);
     }
}

我们再开看一下8.0 BaseDexClassLoader源码

public class BaseDexClassLoader extends ClassLoader {
  public BaseDexClassLoader(String dexPath, File optimizedDirectory,
              String librarySearchPath, ClassLoader parent) {
          super(parent);
          //你会发现optimizedDirectory根本没有使用
          this.pathList = new DexPathList(this, dexPath, librarySearchPath, null);
  
          if (reporter != null) {
              reporter.report(this.pathList.getDexPaths());
          }
}
}
上一篇 下一篇

猜你喜欢

热点阅读