activity冷启动流程图.png
java内存结构.png
Okhttpclient流程图.png
双亲委派机制流程图.png
具体流程大概是这样的:
1.需要加载某个类时,先检查自定义类加载器是否加载过,如果已经加载过,则直接返回。
2.如果自定义类加载器没有加载过,则检查应用程序类加载器是否加载过,如果已经加载过,则直接返回。
3.如果应用程序类加载器没有加载过,则检查扩展类加载器是否加载过,如果已经加载过,则直接返回。
4.如果扩展类加载器没有加载过,则检查启动类加载器是否加载过,如果已经加载过,则直接返回。
5.如果启动类加载器没有加载过,则判断当前类加载器能否加载这个类,如果能加载,则加载该类,然后返回。
6.如果启动类加载器不能加载该类,则交给扩展类加载器。扩展类加载器判断能否加载这个类,如果能加载,则加载该类,然后返回。
7.如果扩展类加载器不能加载该类,则交给应用程序类加载器。应用程序类加载器判断能否加载这个类,如果能加载,则加载该类,然后返回。
8.如果应用程序类加载器不能加载该类,则交给自定义类加载器。自定义类加载器判断能否加载这个类,如果能加载,则加载该类,然后返回。
9.如果自定义类加载器,也无法加载这个类,则直接抛ClassNotFoundException异常。
这样做的好处是:
1.保证类不会重复加载。加载类的过程中,会向上问一下是否加载过,如果已经加载了,则不会再加载,这样可以保证一个类只会被加载一次。
2.保证类的安全性。核心的类已经被启动类加载器加载了,后面即使有人篡改了该类,也不会再加载了,防止了一些有危害的代码的植入。












网友评论