Android ClassLoader笔记(一)

一、Java ClassLoader

ClassLoader:类加载器,主要是用来查找和加载Class文件到JVM。

包括2种类型:系统和自定义。
系统类加载器:Bootstrap CL(BCL),Extensions CL(ECL),App CL(ACL)

BCL:c/c++实现,java代码不能访问到。加载系统类,如java.util.*。JVM启动是通过它创建一个初始类完成的。默认路径jre/lib,可以通过System.getProperty("sun.boot.class.path")获取路径。

ECL:加载除系统外的额外功能,默认路径jre/lib/ext。

ACL:加载当前应用程序Classpath目录下的所有jar和class文件。

运行程序需要几种类型加载器:(1)ACL(2)ECL(3)BCL
CL继承关系:当前应用加载器ACL-ACL的父加载器ECL-ECL的父加载器BCL。
ACL和ECL继承于URLCL,URLCL继承于SecureCL,SCL继承于根类加载器CL。
ACL和ECL都是Launcher的内部类,而Launcher是JVM的入口应用,他们都在Launcher中进行初始化的。

双亲委托模式:CL find class采用这种模式。所谓双亲委托模式就是首先判断该Class是否已经加载,如果没有则委托父加载器查找,这样进行递归,直到委托到最顶层的BCL,如果BCL找到了该Class,就会直接返回,否则继续一次向下查找,如果没找到最后会交由自身去查找。
总而言之,整个过程就是先从下到上委托,然后从上到下查找。

好处:
-避免重复加载
-更安全。如果没有这种模式,就可以自定义一个类替代系统类了。有了这种模式,会使得系统类在JVM启动是被加载而且,只有类同名且被同一个类加载器加载,JVM才会认为是同一个类。所以想骗过JVM显然不会那么容易。

参考:
http://liuwangshu.cn/application/classloader/1-java-classloader-.html

posted @ 2017-12-28 15:48  ha_cjy  阅读(374)  评论(0编辑  收藏  举报