JAVA类加载器

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重复加载

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • ClassLoader介绍 类加载器是负责加载类的一个对象,ClassLoader是一个抽象类。最常见的加载策略是...
    taj3991阅读 6,392评论 1 4
  • ClassLoader的简单介绍 Class的装载大体上可以分为加载类、连接类和初始化三个阶段,在这三个阶段中,所...
    Y了个J阅读 10,204评论 0 0
  • 1. Java 的类加载器的种类都有哪些? 1、根类加载器(Bootstrap) --C++写的 ,看不到源码2、...
    hycomb阅读 1,020评论 0 0
  • 什么是类加载器 Java 需要把源代码编译成 .class 文件,程序才能运行,那个类加载器就是把 .class ...
    RobertCrazying阅读 4,143评论 0 0
  • 1、 ClassLoader 是做什么的 顾名思义,它是用来加载Class的。它负责将Class 的字节码形式转换...
    霸体阅读 3,775评论 0 1