Java类加载机制:从字节码到对象的奇妙之旅

news2024/12/25 10:14:33

目录

什么是类加载机制?

类加载顺序

类加载顺序图

双亲委派模型

双亲委派模型示意图

如何打破双亲委派模型?


要想学好java,首先得知道它是什么,怎么运行的,怎么加载的,运行的是个什么东西,今天我写篇文章说一下,表演开始喽😄

Java是一门面向对象的编程语言,它的特点之一就是可以跨平台运行。为什么可以跨平台,因为Java程序不是直接编译成机器码,而是编译成一种中间格式的字节码(bytecode),然后由Java虚拟机(JVM)在不同的平台上解释执行。

那Java虚拟机是如何加载和执行字节码的?这就涉及到了Java类加载机制

什么是类加载机制?

类加载机制是Java虚拟机将字节码转换成可运行的类的过程。这个过程包括三个主要步骤:加载、链接和初始化​编辑

  • 加载:就是将字节码文件从不同的来源(如本地文件系统、网络、内存等等)读取到虚拟机中,并创建一个对应的Class对象,用来表示这个类在内存中的数据结构。
  • 连接:就是将加载后的Class对象进行验证、准备和解析三个阶段的处理,以保证类的正确性和完整性。其中包含了下面三个小步骤
    • 验证:就是检查元数据Class对象是否符合Java虚拟机规范。验证文件格式验证;验证字节码验证(确定程序语义合法,符合逻辑) ;验证符号引用验证(确保下一步的解析能正常执行)
    • 准备:就是为类中的静态变量分配内存,并赋予默认值。
      • 注意这时内存分配仅包括类变量static,不包括实例变量,实例变量会在对象实例化时随着对象一块分配在java堆中设置的是默认值,注意是默认值,比如static int=11,此时初始值是0,11是初始化才会赋值
      • 解析:就是将类中的符号引用替换为直接引用,即确定类中各个字段、方法、接口等的实际地址。
  • 初始化:就是执行类中的静态初始化器和静态初始化程序,执行静态初始化程序,把静态变量初始化成指定的值;clinit()方法由编译器自动产生,收集类中static{}代码块中类变量赋值语句和类中静态成员变量的赋值语句。此时将会执行静态代码块和静态方法。

初始化过程的注意点

  • clinit()方法中静态成员变量的赋值顺序是根据Java代码中静态成员变量的出现的顺序决定的。
  • 静态代码块能访问出现在静态代码块之前的静态成员变量,无法访问出现在静态代码块之后的成员变量。
  • 静态代码块能给出现在静态代码块之后的静态成员变量赋值。
  • 如果一个类/接口中没有静态代码块,也没有静态成员变量的赋值操作,那么编译器就不会生成clinit()方法
  • 接口中不能使用静态代码块
  • 接口在执行clinit()方法前,虚拟机不会确保其父接口的clinit()方法被执行,只有当父接口中的静态成员变量被使用到时才会执行父接口的clinit()方法
  • 虚拟机会给clinit()方法加锁,因此当多条线程同时执行某一个类的clinit()方法时,只有一个方法会被执行,其他的方法都被阻塞。并且,只要有一个clinit()方法执行完,其它的clinit()方法就不会再被执行。因此,在同一个类加载器下,同一个类只会被初始化一次。
  • 非静态成员变量只有在实例化对象的时候才会分配内存并赋值,非静态成员变量随对象一起保存在堆中

下面的实例解释下,b可以赋值,c不可以,提示Illegal forward reference,因为c在代码块下面,也就是之后

类加载顺序

一般来说,类加载顺序遵循以下原则:

主动引用:当一个类被主动引用时,该类才会被加载。主动引用包括下面几种情况:

  1. 创建类的实例,如new A()。
  2. 调用类的静态方法,如A.method()。
  3. 访问类或接口的静态变量,或者对该静态变量赋值,如A.field或A.field = value。
  4. 反射调用类的方法或构造器,如Class.forName("A")或A.class.getDeclaredMethod("method")。
  5. 初始化一个类的子类,如new B(),其中B是A的子类,这时候会先加载A。
  6. 虚拟机启动时被标明为启动类的类,如java HelloWorld。

被动引用:当一个类被被动引用时,该类不会被加载。被动引用包括下面几种情况:

  1. 访问或设置一个数组类型的静态变量,如A[] arr或A[].length。
  2. 引用一个常量字段,如A.CONSTANT,其中CONSTANT是用final修饰的静态变量,并且在编译期已经确定了值。
  3. 引用一个接口中定义的常量字段,如I.CONSTANT,其中CONSTANT是用public static final修饰的变量,并且在编译期已经确定了值。
  4. 引用一个父类中定义的静态字段,如B.field,其中field是在A中定义的静态变量,而B是A的子类。

类加载顺序图

大家可以验证下,可能需要的示例太多这里先不举例了

双亲委派模型

双亲委派模型是Java类加载机制的一个重要特征,它决定了一个类由哪个类加载器(classLoader)来加载。类加载器是Java虚拟机的一个组件,它负责根据不同的策略来加载类。Java虚拟机提供了三种内置的类加载器:

  • 启动类加载器:它是最顶层的类加载器,负责加载Java核心类库,如java.lang.*、java.util.*等,以及一些虚拟机相关的类,如sun.misc.*等。它不是一个Java类,而是由C++实现的一个本地方法。
  • 扩展类加载器:它是启动类加载器的子类加载器,负责加载Java扩展类库,如javax.*等,以及一些第三方提供的扩展包,如JDBC驱动等。它是一个Java类,叫做sun.misc.Launcher$ExtClassLoader。
  • 应用类加载器:它是扩展类加载器的子类加载器,它负责加载应用程序的类,如自定义的类或第三方提供的类库等。它也是一个Java类,叫做sun.misc.Launcher$AppClassLoader。

除了这三种内置的类加载器外,还可以自定义类加载器,只要继承java.lang.ClassLoader抽象类,并重写其中的findClass方法即可。自定义的类加载器通常会作为应用类加载器的子类加载器。

双亲委派模型的工作原理是:当一个类需要被加载时,首先会委托给其父类加载器去尝试加载,如果父类加载器无法加载,则再由自己去尝试加载。这样就形成了一个从下到上的委托链,最终由启动类加载器作为最后的尝试者。这样做的好处是可以避免重复或冲突的类被加载,保证了Java程序的安全性和稳定性。

双亲委派模型示意图

双亲委派模型的代码在java.lang.ClassLoader类中的loadClass函数中实现,其逻辑如下:

  • 首先检查类是否被加载;
  • 若未加载,则调用父类加载器的loadClass方法;
  • 若该方法抛出ClassNotFoundException异常,表示父类加载器无法加载,则当前类加载器调用findClass加载类;
  • 若父类加载器可以加载,则直接返回Class对象

如何打破双亲委派模型?

举个栗子🌰


public class MyClassLoader extends ClassLoader {
    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        // 这里可以自定义类的加载方式,例如从文件系统加载类文件等
        return super.findClass(name);
    }
}

表演结束,谢谢大家😁,喜欢的别吝啬一个赞哈,谢了

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/676069.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JVM内存模型及JAVA程序运行原理

文章目录 JVM简介JVM的内存结构方法区堆栈程序计数器 JAVA程序在JVM内是如何执行的 JVM简介 JVM------Java Virtual Machine.JVM是Java平台的基础&#xff0c;与实际机器一样&#xff0c;它有自己的指令集&#xff08;类似CPU通过指令操作程序运行&#xff09;&#xff0c;并在…

Temu、shopee、Lazada、Newegg、美客多销量增长黑科技!

在跨境电商的激烈竞争环境下&#xff0c;2023年伴随着疫情的解封&#xff0c;电商业务重新焕发生机。卖家们不应该只在一个平台投放所有资源&#xff0c;而应多元化地进行平台选择。实际上&#xff0c;许多小型电商平台如Wish、敦煌等也能带来大量业务&#xff0c;而且竞争压力…

如何保证API接口的安全性

API接口的安全性是非常重要的&#xff0c;以下是一些保证API接口安全性的措施&#xff1a; 用户认证、授权&#xff1a;接口的调用者必须提供有效的身份认证信息&#xff0c;包括用户名、密码、密钥等&#xff0c;以保证接口的调用者的身份有效性。同时&#xff0c;需要在接口的…

亚马逊云科技中国峰会:Amazon DeepRacer——因构建 而可见

文章目录 一、前言二、 亚马逊云科技中国峰会大会亮点三、Amazon DeepRacer 赛事火热开启四、Amazon DeepRacer 深度体验五、2023亚马逊云科技中国峰会——Amazon DeepRacerAmazon DeepRacer 中国峰会总决赛Girls in Tech Show高校联动&#xff0c;寻找未来“生力军”Amazon De…

电赛汇总(三):常用传感器电路模块设计

电赛汇总(三)&#xff1a;常用传感器电路模块设计 这一章节主要详细记录各种常用的传感器的电子芯片型号、设计原理与思想&#xff0c;以便随时查看翻阅。这部分内容出自黄根春等学者著的《全国大学生电子设计竞赛教程》一书中&#xff0c;感兴趣的朋友可以购买翻阅。 文章目…

Debian12编译安装R软件

1.解压源码包 2.运行./configure --prefix/usr/local/R-4.3 报错&#xff0c;没有安装fortran编译器 3.运行./configure --prefix/usr/local/R-4.3 4.运行./configure --prefix/usr/local/R-4.3 5.运行./configure --prefix/usr/local/R-4.3 6.运行./configure --pref…

厦门大学计算机考研分析

关注我们的微信公众号 姚哥计算机考研 更多详情欢迎咨询 厦门大学&#xff08;B&#xff09;考研难度&#xff08;☆☆☆☆☆&#xff09; 厦门大学计算机考研主要招生学院有信息学院、人工智能研究院、医学院和电影学院。目前均已出拟录取名单。 厦门大学信息学院&#xff…

14. WebGPU 透视投影

在上一篇文章中&#xff0c;介绍了如何制作 3D &#xff0c;但 3D 没有任何透视效果。它使用的是所谓的“正交”视图&#xff0c;它有其用途&#xff0c;但通常不是人们说“3D”时想要的。 现在&#xff0c;需要添加透视图。究竟什么是透视&#xff1f;基本特征就是离得越远的…

牛客网基础语法71~80题

牛客网基础语法71~80题&#x1f618;&#x1f618;&#x1f618; &#x1f4ab;前言&#xff1a;今天是咱们第八期刷牛客网上的题目。 &#x1f4ab;目标&#xff1a;可以掌握循环嵌套&#xff0c;可以采用一些数组来解决问题&#xff0c;对循环知识掌握熟练&#xff0c;对数学…

H5套壳微信小程序跳转H5以及配置服务器接口域名和业务域名

一、H5套壳微信小程序跳转H5 基本语法&#xff1a; <web-view src"https://你的域名"></web-view> 1. 其中&#xff0c;url必须在管理后台加进业务域名&#xff0c;并且是https开头的。 使用了web-view&#xff0c;页面将不能放置其他元素&#xff0c…

【深度学习】RepVGG解析和学习体会,结构重参数化的后的速度比较,代码实现

文章目录 前言0. Vgg1.RepVGG Block 详解 前言 论文名称&#xff1a;RepVGG: Making VGG-style ConvNets Great Again 论文下载地址&#xff1a;https://arxiv.org/abs/2101.03697 官方源码&#xff08;Pytorch实现&#xff09;&#xff1a;https://github.com/DingXiaoH/RepV…

linux动态监控进程懂了没?

这里写目录标题 top交互模式监控网络状态 top top与ps类似&#xff0c;他们都是用来显示正在执行的进程。 两者最大的不同之处就是top在执行一段时间可以更新正在运行的进程。 基本语法&#xff1a; top 选项 选项功能-d 秒数指定top指令每隔几秒更新&#xff0c;默认为3秒-i…

【新星计划·2023】Linux图形、字符界面介绍与区别

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 作者会持续更新网络知识和python基础知识&#xff0c;期待你的关注 前言 本文将介绍图形界面与命令行界面以及它们的区别&#xff0c;登录方法。 目录 一、图形界面与命令行界面介绍 1、图形界面 2、命令行…

Oracle单机版升级(11.2.0.3升级到11.2.0.4)

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

人工神经网络ANN

文章目录 1. 人工神经网络简介1.1 生物神经网络1.2 人工神经网络 2. 人工神经网络原理2.1 ANN的基本构造2.1.1 神经元的结构模型2.1.2 网络拓扑结构 2.2 学习规则2.3 学习算法 3. 人工神经网络特点4. 人工神经网络的Python应用5. 源码仓库地址 1. 人工神经网络简介 1.1 生物神…

北通阿修罗2 Pro 多模板 连接Cemu 支持体感

需要使用体感的游戏基本上都是任天堂的游戏&#xff0c;如塞尔达。所以接下来针对CEMU模拟器介绍如何使用体感。 先看CEMU的手柄配置文档。 https://cemu.cfw.guide/controller-configuration.html 运动控制支持可能因手柄而异。任天堂Switch、Dualshock 4和DualSense手柄都支持…

Nik Color Efex 滤镜详解(5/5)

淡对比度 Pro Contrast 分析图像并为该图像创建特定的颜色&#xff0c;在保持画面细节的同时&#xff0c;实现更高的对比度。 校正色偏 Correct Color Cast 用于纠正色偏。 校正对比度 Correct Contrast 根据光影纠正对比度。 动态对比度 Dynamic Contrast 根据画面对象自动校…

【JY】浅析时程分析中的阻尼设置

&#xff08;非线性&#xff09;直接积分法、快速非线性分析&#xff08;FNA&#xff09;法等时程分析方法中的阻尼设置尤为重要&#xff0c;以SAP2000为例&#xff0c;进行抛砖引玉&#xff0c;各类软件做法也大同小异&#xff0c;可借鉴与学习。 模态阻尼 模态阻尼是用非耦合…

模拟电路系列分享-频率失真

目录 概要 整体架构流程 技术名词解释 技术细节 1.基本问题简介 2.线性失真 3.频率失真的危害 小结 概要 提示&#xff1a;这里可以添加技术概要 继续接着上一节的内容继续分享和学习&#xff0c; 整体架构流程 分三个部分&#xff0c;仔细的分享了失真方面的知识 技术名词…

团体程序设计天梯赛-练习集L1篇④

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;Hello大家好呀&#xff0c;我是陈童学&#xff0c;一个与你一样正在慢慢前行的普通人。 &#x1f3c0;个人主页&#xff1a;陈童学哦CSDN &#x1f4a1;所属专栏&#xff1a;PTA &#x1f381;希望各…