Java 类加载过程

Java 类加载 双亲委派原则

什么是双亲委派原则

简单说下:比如有 爷爷,父亲,孙子 三个角色。现在孙子要做一件事,但他必需要先告诉他的父亲,然后他的父亲再告诉爷爷。爷爷收到事件后,就判断下自己能不能处理,如果不能处理,就交给他的儿子,也就是孙子的父亲去处理。父亲收到后,也判断下自己能不能处理,如果不能处理,就又交回给儿子自己的处理。

看图

Java 类加载过程
现在断点调试下流程:在 new 一个对象的时候,下一个断点
Java 类加载过程
在 ClassLoader 类的 loadClass(String name, boolean resolve) 方法里再下个断点
会看到 name=com.load.TestAppLoad 这是要加载类的(全类名),当前类加载器是 AppClassLoad
会去调用父类的加载器(ExtClassLoad)在执行一次loadClass(String name, boolean resolve),

Java 类加载过程
拓展类加载器执行如图
Java 类加载过程
**加载类为空,是启动类加载器(BootstrapClassLoad) **
Java 类加载过程
**如果没有被 启动类加载器(BootstrapClassLoad) 加载到,就走当前启动类的 findClass() **
Java 类加载过程
接着走到 URLClassLoader类下的 findClass(final String name)方法

Java 类加载过程

这里就有必要提下类加载器 加载的目录

BootstrapClassLoad 启动类加载器:加载JAVA_HOME\jre\lib下的核心包以及JAVA_HOME\jre\classes目录下的.class文件
Java 类加载过程
BootstrapClassLoad 拓展类加载器:加载JAVA_HOME\jre\lib\ext目录下的jar包

Java 类加载过程
AppClassLoad 应用类加载器:加载工程目录以及导入的jar包
Java 类加载过程

总结

为了防御开发者定义的类和JDK定义好的类同包重名而产生冲突问题。
保证该类在内存中的唯一性。

可以自己试下定义一个 java.lang.Object 的类,new Object()看看是自己定义的还是JDK提供的?