Java 类加载过程
Java 类加载 双亲委派原则
什么是双亲委派原则
简单说下:比如有 爷爷,父亲,孙子 三个角色。现在孙子要做一件事,但他必需要先告诉他的父亲,然后他的父亲再告诉爷爷。爷爷收到事件后,就判断下自己能不能处理,如果不能处理,就交给他的儿子,也就是孙子的父亲去处理。父亲收到后,也判断下自己能不能处理,如果不能处理,就又交回给儿子自己的处理。
看图
现在断点调试下流程:在 new 一个对象的时候,下一个断点
在 ClassLoader 类的 loadClass(String name, boolean resolve) 方法里再下个断点
会看到 name=com.load.TestAppLoad 这是要加载类的(全类名),当前类加载器是 AppClassLoad
会去调用父类的加载器(ExtClassLoad)在执行一次loadClass(String name, boolean resolve),
拓展类加载器执行如图
**加载类为空,是启动类加载器(BootstrapClassLoad) **
**如果没有被 启动类加载器(BootstrapClassLoad) 加载到,就走当前启动类的 findClass() **
接着走到 URLClassLoader类下的 findClass(final String name)方法
这里就有必要提下类加载器 加载的目录
BootstrapClassLoad 启动类加载器:加载JAVA_HOME\jre\lib下的核心包以及JAVA_HOME\jre\classes目录下的.class文件
BootstrapClassLoad 拓展类加载器:加载JAVA_HOME\jre\lib\ext目录下的jar包
AppClassLoad 应用类加载器:加载工程目录以及导入的jar包
总结
为了防御开发者定义的类和JDK定义好的类同包重名而产生冲突问题。
保证该类在内存中的唯一性。