JDK 自带了三种类加载器 bootstrapClassLoader、ExtClassLoader、AppClassLoader

    • bootstrapClassLoader 是 ExtClassLoader 的父加载器 负责加载 JAVA_HOME lib 下的jar包和class文件 。用 C 语言编写
    • ExtClassLoader 是 AppClassLoader 的父加载器,负责加载 JAVA_HOME lib/ext文件夹下的jar包和class文件。 用 Java 编写
    • AppClassLoader 是自定义类加载器 的父加载器,负责 classpath 下的类文件。它不止是系统类加载器而且是线程上下文加载器
    • 继承 Classloader 实现自定义类加载器

    双亲委派/双亲委托
    从加载的类加载器起 先向上委托 在向下查找。
    向上委托: 自定义加载 —》 AppClassLoader —》ExtClassloader — 》BootStrapClassLoader
    查询自己的缓存看有没有加载过,然后逐级 查找自己的缓存 看看是否加载过
    向下查找:向上委托到顶级类加载器 BootStrapClassLoader 查询缓存没有后 开始查找自己加载路径下有没有, 然后逐级 查找加载路径下 到 发起的类加载器

    image.png
    优点:

    1. 沙箱安全机制:比如自己写的 String.class 类不会被加载.这样可以防止核心库被随意篡改(所有 java. 开头的类都不会加载)
    2. 避免类被重复加载:因为JVM 中区分不同类,不仅仅是类名,相同的class文件被不同的ClassLoader 加载就是两个类