类加载器是什么
类的装载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。而这个类装载的过程是通过类加载器实现的。 “类加载器”的任务是,根据一个类的全限定名来读取此类的二进制字节流到JVM中,然后转换为一个与目标类对应的java.lang.Class对象实例。 在Java中,一个类用其全限定类名(包括包名和类名)作为标识; 但在JVM中,一个类用其全限定类名和其类加载器作为其唯一标识。 虚拟机提供了3种类加载器:
- 启动(Bootstrap)类加载器
- 扩展(Extension)类加载器
- 应用程序(Application)类加载器(也称系统类加载器)。
类加载器的分类
启动类加载器:Bootstrap ClassLoader,负责加载存放在**JDK\jre\lib**
(JDK代表JDK的安装目录,下同)下,或被-Xbootclasspath参数指定的路径中的,并且能被虚拟机识别的类库 扩展类加载器:Extension ClassLoader,该加载器由sun.misc.Launcher$ExtClassLoader实现,它负责加载**JDK\jre\lib\ext**
目录中,或者由java.ext.dirs系统变量指定的路径中的所有类库(如javax.*开头的类),开发者可以直接使用扩展类加载器。 应用程序类加载器:Application ClassLoader,该类加载器由**sun.misc.Launcher$AppClassLoader**
来实现,它负责加载用户类路径(ClassPath)所指定的类,开发者可以直接使用该类加载器
类加载机制
全盘负责:当一个类加载器负责加载某个Class时,该Class所依赖的和引用的其他Class也将由该类加载器负责载入,除非显示使用另外一个类加载器来载入 父类委托:先让父类加载器试图加载该类,只有在父类加载器无法加载该类时才尝试从自己的类路径中加载该类 缓存机制:缓存机制将会保证所有加载过的Class都会被缓存,当程序中需要使用某个Class时,类加载器先从缓存区寻找该Class,只有缓存区不存在,系统才会读取该类对应的二进制数据,并将其转换成Class对象,存入缓存区。这就是为什么修改了Class后,必须重启JVM,程序的修改才会生效
https://blog.csdn.net/sky__fall/article/details/109698544https://juejin.cn/post/6844903564804882445#heading-5