类加载器一共有4种:
①BootstrapClassLoader:根类加载器。C/C++语言实现的。加载jre的rt.jar
②ExtClassLoader:扩展类加载器。负责加载jre中除rt.jar以外的jar包
③AppClassLoader:应用类加载器。负责加载classpath及项目中类的class文件
④自定义类加载:继承ClassLoader基类
jvm中的类加载器为什么要定义这样的规则,有什么好处呢?
答案:保证JDK的安全性、稳定性。
这个规则具体流程是什么样的呢?
比如User.java文件,需要类加载器去加载它;
先找到了AppClassLoad加载器,这个加载器有父亲,他就不想自己干了,就交给了父亲干;
就找到了ExtClassLoad加载器,这个加载器也有父亲,也不想干了,也交给父亲干;
就找到了BootStrapClassLoad,它没有父亲了,只能自己干;
结果BootStrapClassLoad加载不了,就给了它的孩子ExtClassLoad加载;
结果ExtClassLoad也加载不了,就给了他的孩子AppClassLoader加载;
如果AppClassLoader也加载不了就给了自定义类加载器,如果自定义加载器都加载不了,那么加载失败,包ClassNotFoundException异常。比如我们平时引一个jar包没有下载完整,运行就会爆类找不到这个异常