简单记录,方便记忆。
前面讲完JVM、Dalvik、ART,与这里的ClassLoader息息相关。
一、Java中的ClassLoader
BootstrapClassLoader(引导类加载器):c/c++实现的根加载器,加载目录为:$JAVA_HOME/lib。
ExtensionsClassLoader(拓展类加载器):加载目录为:$JAVA_HOME/lib/ext/。
ApplicationClassLoader(应用程序加载器):加载目录为:classpath和用户应用程序代码。
二、自定义ClassLoader
因加载自定义路径文件,需要自定义ClassLoader继承基类ClassLoader。必须遵从双亲委托模式,重要三函数loadClass()(目标类加载入口),findClass()(子类自己实现加载目标类),defindClass()(将字节码转成Class对象)。
三、双亲委托模式
1、Class未被加载情况下,由父到子查找。
2、双亲委托模式的好处
1)避免重复加载,若已加载直接从缓存中读取。
2)更加安全,避免开发者修改系统类(如自定义String类代替系统String类)。
四、Android中的ClassLoader
BootClassLoader:系统启动时用于加载系统常用类,ClassLoader内部类。
PathClassLoader:加载系统类和应用程序类,一般不建议开发者使用。
DexClassLoader:加载dex文件及包含dex文件的apk或jar。也支持从SD卡进行加载,这也就意味着DexClassLoader可以在应用未安装的情况下加载dex相关文件。因此,它是热修复和插件化技术的基础。
五、ClassLoader搜寻方法 — 遵循双亲委托并按如下调用
上述一些ClassLoader初始化在ZygoteInit.java类中,具体可看源码。