类的加载的机制:主要从两个方面回答。我们自己写的java文件到最终的运行,它必须经过编译和类加载这两个阶段。
编译的过程就是把.java文件编程成class文件;类加载过程 就是把.class文件加载到JVM内存中,装载完成后会得到一个class对象,我们就可以使用new关键来实例化这个对象。
而类的加载过程需要涉及到类加载器,JVM在运行的时候会产生三个类加载器,组成了一个层级关系,每一个类加载器分别去加载不同作用范围的jar包。
BootStrap ClassLoader、它主要负责java核心类库的加载,也就是%{JDK_HOME}\lib下面的一个rt.jar和resources.jar等。
Extension ClassLoader主要负责%{JDK_HOME}\ext目录下的一个jar包和class文件;
Application ClassLoader主要负责当前应用里面classpath下面的所有jar包和类文件,除了系统自己提供的类加载器之外,还可以通过ClassLoader类来实现自定义加载器去满足一些特殊的场景需求。
所谓的双亲委派机制:就是按照类加载器的层级关系,逐层进行委派(向上委派,向下加载)。比如说我们当我们需要加载一个class文件时候,我们会首先把这个class文件查询和加载委派给父加载器去执行,如果父加载器都无法加载,那么再尝试自己来加载这个class类。
这么设计的好处:
第一个是安全性,因为这种层级关系实际上代表的是一种优先级,也就是说所有的类加载都需要优先给到BootStrap ClassLoader,那么对于核心类库中的一些类就没有办法被破坏,比如说自己写一个java.lang.String最终还是要交给启动类加载器再加上每个类加载器的本身的一个作用范围那么自己写的java.lang.String就没有办法去覆盖类库中的类。
第二个,我认为这种层级关系的设计可以避免重复加载,导致程序混乱的一些问题,因为如果父加载器已经加载过了,子类加载器就没有必要再去加载了。
,