JVM_4类加载器
类加载器
类加载器是Java虚拟机提供给应用程序取获取类和接口字节码数据的技术类加载器应用场景
类加载器的分类
启动类加载器
启动类加载器(Bootstrap ClassLoader) 是有Hotspot虚拟机提供的 使用c++编写的类加载器
默认加载Java安装目录/jre/lib下的类文件 比如rt.jar,tools.jar, resources.jar等
通过启动类加载器去加载用户jar包(不推荐)
使用参数进行扩展
双亲委派机制
使用应用类加载器去加载类 却发现是扩展类加载器对类进行加载
在类加载器的过程中 每个类加载器都会先检查是否已经加载了该类 如果已经加载了则直接返回 否则会加载请求委派给父类加载器
在双亲委派机制中 如果parent为null 则会提交给启动类加载器处理
如果所有的父类都无法加载该类 则由当前类加载器自己尝试加载 所以看上去自顶向下尝试
第二次再去加载相同的类 仍然会向上进行委派 如果某个类加载器加载过就会直接返回
双亲委派机制例题:
双亲委派机制的作用:
- 保证类加载的安全性
- 通过双亲委派机制 让顶层的类加载器去加载核心类 避免恶意代码替换JDK中的核心类库
- 避免重复加载
- 双亲委派机制可以避免同一个类被多次加载 上层的类加载器如果加载过类 就会直接返回该类 避免了重复加载
打破双亲委派机制
打破双亲委派机制的3种方式
1.自定义类加载器
示例: Tomcat
正确的去实现一个自定义类加载器的方式是重写findClass方法 这样不会破坏双亲委派机制
线程上下文类加载器
Osgi框架的类加载器
JDK9
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 niiish32x 's blog!