1. 类加载器
    类加载器是Java虚拟机提供给应用程序取获取类和接口字节码数据的技术

  2. 类加载器应用场景

类加载器的分类

启动类加载器

启动类加载器(Bootstrap ClassLoader) 是有Hotspot虚拟机提供的 使用c++编写的类加载器
默认加载Java安装目录/jre/lib下的类文件 比如rt.jar,tools.jar, resources.jar等

通过启动类加载器去加载用户jar包(不推荐)
使用参数进行扩展

双亲委派机制

使用应用类加载器去加载类 却发现是扩展类加载器对类进行加载

在类加载器的过程中 每个类加载器都会先检查是否已经加载了该类 如果已经加载了则直接返回 否则会加载请求委派给父类加载器
在双亲委派机制中 如果parent为null 则会提交给启动类加载器处理
如果所有的父类都无法加载该类 则由当前类加载器自己尝试加载 所以看上去自顶向下尝试
第二次再去加载相同的类 仍然会向上进行委派 如果某个类加载器加载过就会直接返回

双亲委派机制例题:

双亲委派机制的作用:

  1. 保证类加载的安全性
    1. 通过双亲委派机制 让顶层的类加载器去加载核心类 避免恶意代码替换JDK中的核心类库
  2. 避免重复加载
    1. 双亲委派机制可以避免同一个类被多次加载 上层的类加载器如果加载过类 就会直接返回该类 避免了重复加载

打破双亲委派机制

打破双亲委派机制的3种方式

1.自定义类加载器
示例: Tomcat

正确的去实现一个自定义类加载器的方式是重写findClass方法 这样不会破坏双亲委派机制

  1. 线程上下文类加载器

  2. Osgi框架的类加载器

JDK9