如下内容为个人总结,如有错误,欢迎评论区指正;
-
类加载过程中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让程序自己决定如何获取所需要的类,实现这个动作的代码模块就是“类加载器”;
-
使用不同的类加载器加载相同的类,instanceof时是false的;
-
双亲委派机制
-
虚拟机的类加载器
-
启动类加载器 Bootstrap ClassLoader
-
负责加载lib目录下的类库
-
-
拓展类加载器 Extension ClassLoader
-
加载lib\ext目录下的类库
-
-
应用程序类加载器 Application ClassLoader
-
加载用户路径(ClassPath)下的类库
-
-
自定义类加载器
-
重写findClass方法
-
-
-
双亲委派机制工作过程:一个类加载器收到加载类的请求,先委派给父加载器加载,如果父加载器无法加载,则由子加载器加载;
-
双亲委派机制保证Java类的层次关系,避免重复加载和避免核心类被破坏;
-
破坏双亲委派机制
-
JDBC,使用启动类加载器加载mysql.jdbc.Driver这个本应该子类加载器加载的类;
-
原理就是JNDI由启动类加载器加载,而调用的SPI接口则是在ClassPath下,启动类加载器时访问不到的,此时可以通过上下文加载器来加载SPI接口的代码,实现了父类加载器加载子类加载器的类;
-
-
参考《深入理解Java虚拟机》