Android中的class loader如上图,class loader使用双亲委托模型,简单说就是当一个classloader开始加载类的时候,它总是让它的parent去尝试加载,如果失败,那么再尝试自己加载,这个设计的好处是带来安全性,避免了伪造类
DexClassLoader可以指定自己的optimizedDirectory,所以它可以加载外部的dex,因为这个dex会被复制到内部路径的optimizedDirectory;而PathClassLoader没有optimizedDirectory,所以它只能加载内部的dex,这些大都是存在系统中已经安装过的apk里面的。
通过XXX.getClassLoader()可以知道这个class是由哪个classloader加载的
一个运行的Android应用至少有2个ClassLoader,BootClassLoader(系统启动的时候创建的)以及PathClassLoader(应用启动时创建的)
同一个Class = 相同的 ClassName + PackageName + ClassLoader,如果同一个类被不同classloader重复加载了会抛出异常
网友评论