类加载器图
1.类加载器可以分为两类:一种是启动类加载器(bootstrap classLoader)是由C++语言实现的,
是虚拟机的一部分;另一种是其他所有的类加载器,是由java语言实现的,独立与虚拟机之外,都
继承于抽象类java.lang.classLoader。
2.启动类加载器:加载java.lang包,javax包下的类;
3扩展类加载器:加载<JAVA_HOME>\lib\ext目录中,或者被Java.ext.dirs系统变量所指定路径中
所有的类库;
4.系统类加载器(应用程序类加载器):加载用户自定义的类(用户类路径上所有的类库)。
5.双亲委派模型的原理:
(1)把自定义的加载器挂载到应用程序类加载器
(2)应用程序类加载器将加载请求委托给扩展类加载器
(3)扩展类加载器将加载请求委托给启动类加载器
(4)启动类加载器会在加载路径下查找并加载class文件,没找到就交给扩展类加载器加载
(5)扩展类加载器也在自己的加载路径下查找并加载class文件,没找到就交给应用程序类加载器加载
(6)应用程序类加载器在自己的加载路径下查找并加载class文件,没找到,就交给自定义加载器加载
(7)如果自定义加载器也没找到目标class文件,就抛出ClassNotFound异常
6:双亲委派模型的优点:
1)避免了加载了多个相同名称的类,造成程序的混乱。比如你要调用
Java.lang包下的String类,如果你自己也写了一个Java.lang.String类,被加载了。当你要用String
类的时候,JVM就懵逼了,不知道要调用哪一个。
2)保护了java的核心类库,防止核心类库被随意篡改