美文网首页
JAVA类加载器

JAVA类加载器

作者: 酥苏落叶 | 来源:发表于2022-04-30 21:27 被阅读0次

    JAVA类加载器有三大类

    1. BootstarpClassLoder是顶级类加载器,默认加载%JAVA_HOME%中lib文件夹下的jar包和class文件,在ExtClassLoader中使用parent字段指向该类,但没有继承关系;
    2. ExtClassLoder是扩展类加载器,默认加载%JAVA_HOME%中lib文件夹下的jar包和class文件,在AppClassLoader中使用parent字段指向该类,但没有继承关系;
    3. AppClassLoader(应用程序加载器/系统类加载器)是自定义加载器的父类,负责加载classPath下的类文件,引用的jar包以及自定义类都是这个加载器进行加载的,同时AppClassLoader还是线程上下文加载器,如果想实现一个自定义加载器的话就继承(extends)ClassLoader来实现.

    类加载的流程

    2.1. 向上委派

    AppClassLoader是加载我们自己编写的class类的,当他遇到一个新的class类的时候,不会直接进行加载,而是向上委派给ExtClassLoader,向上委派就是去查找ExtClassLoader是否缓存了这个class类,如果有则返回,如果没有则继续委派给BootstrapClassLoader,如果BootstrapClassLoader中缓存有则加载返回.

    2.2. 向下查找

    开始进行向下查找了,就意味着当前class类向上委派到BootstrapClassLoader时还是没有该类的缓存,此时BootstrapClassLoader会查找加载自己路径也就是%JAVA_HOME%/lib下的jar与class类文件,如果有则加载返回,没有则继续向下查找。ExtClassLoader也是做同样的操作。查找加载ExtClassLoader对应路径的文件,如果有则加载返回,没有则继续向下到AppClassLoader查找加载,AppClassLoader是加载classPath也就是我们程序员自己编写的class类,如果AppClassLoader找不到则会抛出找不到class类异常

    2.3. 流程简介

    向往委派是到顶层类加载器为止,向下查找是到发起的加载器为止,如果是有自定义类加载的情况,发起和截至会是这个自定义加载器。

    2.4. 作用

    这样做的原因主要是为了安全,避免程序员编写类动态替换Java的核心类比如说String,同时也是避免了相同的class类被不同的ClassLoader重复加载

    相关文章

      网友评论

          本文标题:JAVA类加载器

          本文链接:https://www.haomeiwen.com/subject/kniryrtx.html