一篇文章带你深入理解 Java 中的Class.getClassLoader[通俗易懂]

一篇文章带你深入理解 Java 中的Class.getClassLoader[通俗易懂]文章目录一、ClassLoader的作用二、ClassLoader层次结构三、Class加载时调用类加载器的顺序一、ClassLoader的作用我们都知道java程序写好以后是以.java(文本文件)的文件存在磁盘上,然后,我们通过(bin/javac.exe)编译命令把.java文件编译成.class文件(字节码文件),并存在磁盘上。但是程序要运行,首先一定要把.class文件加载…

大家好,又见面了,我是你们的朋友全栈君。

一、ClassLoader 的作用

我们都知道java程序写好以后是以.java(文本文件)的文件存在磁盘上,然后,我们通过(bin/javac.exe)编译命令把.java文件编译成.class文件(字节码文件),并存在磁盘上。
但是程序要运行,首先一定要把.class文件加载到JVM内存中才能使用的,我们所讲的classLoader,就是负责把磁盘上的.class文件加载到JVM内存中,如下图所示:
在这里插入图片描述
你可以认为每一个Class对象拥有磁盘上的那个.class字节码内容,每一个class对象都有一个getClassLoader()方法,得到是谁把我从.class文件加载到内存中变成Class对象的

二、ClassLoader 层次结构

在这里插入图片描述
(1)根类加载器(null)
它是由本地代码(c/c++)实现的,你根本拿不到他的引用,但是他实际存在,并且加载一些重要的类,它加载(%JAVA_HOME%\jre\lib),如rt.jar(runtime)、i18n.jar等,这些是Java的核心类。
(2)平台类加载器(PlatformClassLoader)(jdk1.8之后的版本,之前的称为扩展类加载器 ExtClassLoader)
虽说能拿到,但是我们在实践中很少用到它,它主要加载扩展目录下的jar包, %JAVA_HOME%\lib\ext
(3)应用类加载器(appClassLoader)
它主要加载我们应用程序中的类,如Test,或者用到的第三方包,如jdbc驱动包等。这里的父类加载器与类中继承概念要区分,它们在class定义上是没有父子关系的。

三、Class 加载时调用类加载器的顺序

当一个类要被加载时,有一个启动类加载器和实际类加载器的概念,这个概念请看如下分析:

如上面的Test.class要进行加载时,它将会启动应用类加载器进行加载Test类,但是这个应用类加载器不会真正去加载它,而是会调用看是否有父加载器,结果有,是扩展类加载器,扩展类加载器也不会直接去加载,它看自己是否有父加载器没,结果它还是有的,是根类加载器。

所以这个时候根类加载器就去加载这个类,可在%JAVA_HOME%\jre\lib下,它找不到dir_b.Test这个类,所以他告诉他的子类加载器,我找不到,你去加载吧,子类扩展类加载器去%JAVA_HOME%\lib\ext去找,也找不着,它告诉它的子类加载器 AppClassLoader,我找不到这个类,你去加载吧,结果AppClassLoader找到了,就加到内存中,并生成Class对象。
这个时间时候启动类加载器(应用类加载器)和实际类加载器(应用类加载器)是同一个.

这也是 Java 中著名的委托加载机制:
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/131116.html原文链接:https://javaforall.net

(0)
上一篇 2022年4月29日 下午2:40
下一篇 2022年4月29日 下午3:00


相关推荐

  • Claude Code 完全指南:使用方式、技巧与最佳实践

    Claude Code 完全指南:使用方式、技巧与最佳实践

    2026年3月16日
    2
  • vue – vue.config.js中devServer配置

    vue – vue.config.js中devServer配置前言 nbsp nbsp nbsp nbsp 这里写你调用接口的基础路径 来解决跨域 如果设置了代理 那你本地开发环境的 axios 的 baseUrl 要写为 即空字符串只有一个接口 ip 端口时 devServer open false 跨域 proxy nuojinadm target http

    2026年3月18日
    2
  • navicat15 最新激活码【2021最新】

    (navicat15 最新激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月21日
    79
  • BigDecimal 乘法问题

    BigDecimal 乘法问题直接用我的代码和结果描述一下问题吧 代码 Createdbyzha aeon2016 5 17 publicclassD publicstatic String args BigDecimala newBigDecima BigDecima

    2026年3月19日
    3
  • 虚拟机安装VMware Tools仍旧不能复制粘贴的解决方法–共享文件夹

    虚拟机安装VMware Tools仍旧不能复制粘贴的解决方法–共享文件夹我们有时会遇到一个问题,那就是我们可以从主机往虚拟机里复制文件,但是从虚拟机往主机复制文件就不行,鼠标永远在虚拟机内。博主重装很多次VMwareTools都没有用,这时就可以考虑共享文件夹。设置共享文件夹步骤如下:1.打开虚拟机设置,打开选项2.点击添加(A)3.设置主机路径和名称4.下一步之后文件夹共享改为总是启用(E)5.博主这里是G:\虚拟机共享文…

    2022年5月18日
    482
  • IntelliJ IDEA卸载与安装

    IntelliJ IDEA卸载与安装一、卸载(首次安装可跳过)导出配置运行卸载程序删除缓存&配置&插件卸载完成二、下载安装(一)官网:官网:http://www.jetbrains.com/idea/download/#section=windows官方文档:http://www.jetbrains.com/help/idea/meet-inte…

    2022年6月15日
    54

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号