类加载过程
- 加载
- 验证
- 准备:为变量分配空间,赋零值
- 解析:符号引用转为直接引用
- 初始化:执行 static 的内容,为变量赋程序定义的初始值
- 使用
- 销毁
若URLClassLoader加载的jar中,有内部一类的jar,且一起打包在一起了,则无法直接加载,可以通过使用!/ 的方式,将内部的文件读取出来,写到本地,在通过file文件文件流,再次手动加载,且不能在使用过程中关闭,否则,可能报找不到类
参考:https://blog.csdn.net/feinifi/article/details/130165703
https://blog.csdn.net/a18602320276/article/details/129925935
双亲委派模型
- 【BootStrap】启动 类加载器
- 【Extension】扩展 类加载器
- 【Application】应用程序 类加载器
- 【User】自定义 类加载器
自底向上 检测类是否被加载
- 已被加载,则直接返回类对象
- 未被加载,则委派父类加载器加载(父类未加载,则向上循环)
双亲委派机制【优点】
- (1) 避免类的重复加载
- (2) 类加载器 加载 自己管理【范围】内的类
如何打破
自定义类加载器:
重点:
- 1、继承URLClassLoader,parent设置为null
- 2、在调用方法的时候,设置Thread.getClassLoader = 自定义的classloader,调用完毕后,在恢复
避免目标类中的第三方依赖不隔离
如使用Thread.currentThread.getContextClassLoader()
实际应用场景
热部署
热部署是在不重启 Java 虚拟机的前提下,能自动侦测到 class 文件的变化,更新运行时 class 的行为
方法
创建自己的 classloader 来加载需要监听的 class,这样就能控制类加载的时机,从而实现热部署。
热部署步骤:
- 1、销毁自定义classloader(被该加载器加载的class也会自动卸载);
- 2、更新class
- 3、使用新的ClassLoader去加载class