1.什么是类加载
通过javac将.java文件编译成.class字节码文件后,则需要将.class加载到JVM中运行,哪么是谁将.class加载到JVM的呢?那就是类加载器啦。
2.类加载器类型
Bootstrap ClassLoader(启动类加载器):该类加载器由C++实现的。负责加载Java基础类,对应加载的文件是%JRE_HOME/lib/ 目录下的rt.jar、resources.jar、charsets.jar和class等。
Extension ClassLoader(标准扩展类加载器):继承URLClassLoader。对应加载的文件是%JRE_HOME/lib/ext 目录下的jar和class等。
App ClassLoader(系统类加载器):继承URLClassLoader。对应加载的应用程序classpath目录下的所有jar和class等。
CustomClassLoader(用户自定义类加载器):由Java实现。我们可以自定义类加载器,并可以加载指定路径下的class文件。
3.什么是双亲委派机制
双亲委派机制是当类加载器需要加载某一个.class字节码文件时,则首先会把这个任务委托给他的上级类加载器,递归这个操作,如果上级都没有加载该.class文件,自己才会去加载这个.class。
4.为什么叫双亲委派机制
双:代表是两两的意思。亲:代表两者之间有着千丝万缕的关系。委派:则是我们个人办不到的事情,委托别人去帮我们完成。事实上,类的加载分两步,第一步是先检查 逐层类加载器检查是不是加载过这个类,
检查完,这个类就在 引导类加载器里了,发现这几层类加载器都没加载过这个类,这时候开始第二步,即从启动类加载器(引导类加载器)开始检查,这个类是不是 这个加载器负责加载的,
如果是,就直接加载,如果不是就让下一层去尝试加载,如果到了最基层的类加载器都加载不了这个类,就报 classNotFound
5.双亲委派的作用
①防止加载同一个.class。通过委托去询问上级是否已经加载过该.class,如果加载过了,则不需要重新加载。保证了数据安全。
②保证核心.class不被篡改。通过委托的方式,保证核心.class不被篡改,即使被篡改也不会被加载,即使被加载也不会是同一个class对象,因为不同的加载器加载同一个.class也不是同一个Class对象。这样则保证了Class的执行安全。
https://img2020.cnblogs.com/blog/1712406/202010/1712406-20201023234732807-1907718504.png