ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

类加载器的分类 ClassLoader

2021-02-08 19:34:54  阅读:217  来源: 互联网

标签:Bootstrap ExtClassLoader ClassLoader 分类 ClassPath AppClassLoader 父类 加载


类加载器的分类

1 三个类加载器

常见的类加载器有三种,每个类加载器负责加载不同位置的类:

1)Bootstrap 根类加载器;

2)ExtClassLoader 扩展类加载器;

3)AppClassLoader 系统/应用类加载器;

image-20201216093803250

那么这三种类加载器各有什么作用或者有什么区别呢?

他们三个加载的范围是不一样的。

说明:

1)Bootstrap 根类加载器

它是最顶级的类加载器,它的底层不是一个类,而是有c++一段代码生成的。

用来加载类文件不是我们自己书写的,而是负责Java核心类的,比如System,String等。

因为只有把所有类加载到内存中,我们才可以使用。

2)ExtClassLoader 扩展类加载器

加载的是扩展类的,我们是用不到的,都是jdk内部自己使用的。

3)AppClassLoader 系统/应用类加载器

是用来加载我们自己书写的类的.class文件的,比如 Person 、Student等

是用来加载ClassPath 指定的所有jar或目录,ClassPath表示存放类路径的。我们如果不配置ClassPath,那么就表示当前文件夹。

在idea环境下的ClassPath是out目录。在out目录存放的都是我们书写好的class文件,也就是说 AppClassLoader 类加载器是用来加载我们书写的out目录下的class文件。

2 三个类加载器的关系

Bootstrap 是根,它是最顶级的类加载器,它的底层不是一个类,而是有c++一段代码生成的。

ExtClassLoader extends Bootstrap { }

AppClassLoader extends ExtClassLoader { }

备注:对于类加载器 ExtClassLoader 和 AppClassLoader 也要被类加载器加载才能使用。

他们是被各自的父类加载器加载的。

即:ExtClassLoader 是被 Bootstrap 加载器加载的。

​ AppClassLoader 是被 ExtClassLoader 加载器加载的。

3 获取一个类的类加载器

需求:演示类加载器的父子关系。

getClassLoader() 获取该类的类加载器

代码演示如下所示:

分析:如何获取一个类的类加载器呢?

如果想获得当前类的加载器,那么首先必须获得当前类的字节码文件对象,而这个字节码文件对象属于Class类型,我们可以使用 Class类中的getClassLoader()函数来获得类加载器:
ClassLoader getClassLoader() 返回该类的类加载器 

AppClassLoader:加载classPath中的所有的类,也就是我们自己写的那些类!
注意:类加载器,也是一个类,也需要被加载。一般类加载器都是被父类加载器加载的!
获取父类加载器的方法:使用ClassLoader 类中的getParent()返回委托的父类加载器 。

说明:AppClassLoader是被ExtClassLoader加载的!
ExtClassLoader肯定也是一个类,需要被父加载,它的父亲是BootStrap。
那么问题来了:如果这个类加载器也需要被人加载,那么就没有尽头了!因此,BootStrap是不需要被加载的。
因为它不是一个Java类。它是用C++实现的一段代码。
也就是说,jvm虚拟机一启动就会运行C++实现的这段代码,那么BootStrap类一旦被启动就会开始加载他下面的子类了。

注意:最顶级的类加载器不是Java类,而是C++实现的代码。

标签:Bootstrap,ExtClassLoader,ClassLoader,分类,ClassPath,AppClassLoader,父类,加载
来源: https://www.cnblogs.com/wenqidao/p/14390136.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有