当一个.class文件要加载进入java内存中需要借助ClassLoader
在java虚拟机的角度考虑可以分为这么两种ClassLoader:
由c++语言编写的BootStrapClassLoader,加载启动java虚拟机所需要的类,属于java虚拟机的一部分。
其他ClassLoader,当载其他类。如ExtClassLoader和AppClassLoader和AppClassLoader
三个核心ClassLoader:
BootStrapClassLoader,加载%JAVA_HOME%/jre/lib下的jar包
ExtClassLoader,加载%JAVA_HOME%/jre/lib/ext下的jar包
AppClassLoader,上述两个加载器剩下的默认加载器。
以上三个类是JDK提供的加载器,并不是继承关系,但是被称为父子类加载器,越往上越是父类加载器。
双亲委派模型
AppClassLoader是所有用户自定义的加载器的父类加载器,双新委派模型指的是,当子类加载器要加载一个class文件时,子类加载器会先传递让父类去加载,而父类也会往上传递,直到传至BootStrapClassLoader,如果BootSrapClassLoader无法加载,就会逐层传递下去,尝试让子类加载器去加载,如果一直传递到最初发起请求的类加载器都无法加载,则throw ClassNotFoundException
双新委派模型确保了类在各种环境下有序加载,而且通过文件名规定了哪些类由哪些加载器加载也防止了不可信任类扮演信任类的角色。