一篇文章带你深入理解 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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Windows中如何查看日志(如查看远程登陆的IP地址)以及常用日志ID

    Windows中如何查看日志(如查看远程登陆的IP地址)以及常用日志ID【时间】2018.12.12【题目】Windows中如何查看日志(如查看远程登陆的IP地址)以及常用日志ID概述在Windows中可以使用事件查看器来查看相关日志,并结合日志ID进行日志筛选。常见的日志有: 4634-帐户被注销   4647-用户发起注销   4624-帐户已成功登录(可以查看   4625-帐户登…

    2022年5月14日
  • android contentprovider_android sharedpreferences

    android contentprovider_android sharedpreferences我想使用具有对Activity的引用的动态注册BroadcastReceiver,以便它可以修改其UI。我正在使用Context.registerReceiver()方法,但从未调用接收者的onReceive()方法。这是显示问题的示例代码:packagecom.example;importandroid.app.Activity;importandroid.app.IntentServi…

    2022年9月12日
  • VS2017 安装 Microsoft Visual Studio Installer Project

    VS2017 安装 Microsoft Visual Studio Installer Project1.安装打包插件:MicrosoftVisualStudio2017安装程序项目2.联机查找下面的组件,然后安装,重启VS,进行插件安装3.新建安装项目,另外,有些人可能会想这么多安装类型,怎么选。因为我们这里说的Windows程序打包,输出文件格式为.exe或者.msi,大概看一下介绍就能知道,第一个和第四个是合适的。这两个又该怎么选呢?那其实第四个就是对一些属性多了些引导,最…

    2022年7月20日
  • access token

    最短时间来,打算把自己学习的东西都总结一遍,发到博客上面来。带大家来了解windows访问令牌0x00acesstoken的作用accesstoken的作用说简单点就是为了系统的安全0x

    2021年12月11日
  • golang2021激活码【注册码】

    golang2021激活码【注册码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月18日
  • Dll注入技术之劫持注入「建议收藏」

    Dll注入技术之劫持注入「建议收藏」Dll注入技术之劫持注入测试环境系统:Windows732bit工具:FileCleaner2.0和lpk.dll主要思路利用Window可以先加载当前目录下的dll特性,仿造系统的LPK.DLL,让应用程序先加载我们的伪LPK.DLL,然后在我们的dll中去调用原来系统的原函数.引用网络中的原理讲解●背景知识●首先我们要了解Windows为什么可以DLL劫持呢?主要是因为Windows的…

    2022年5月17日

发表回复

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

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