JAVA中类的加载过程

2023-11-07

摘自《http://soft.chinabyte.com/database/312/12643812.shtml

http://www.cnblogs.com/yshb/archive/2012/11/05/2756194.html

类的生命周期

  加载 loading

  验证 verification

  准备 preparation

  解析 resolution

  初始化 initialization

  使用 using

  卸载 unloading

 

有且只有以下四种情况必须立即对类进行”初始化”(称为对一个类进行主动引用):

  1. 遇到new、getstatic、putstatic、invokestatic这四条字节码指令时(使用new实例化对象的时候、读取或设置一个类的静态字段、调用一个类的静态方法)。
  2. 使用java.lang.reflet包的方法对类进行反射调用的时候。
  3. 当初始化一个类的时候,如果发现其负类没有进行过初始化,则需要先触发其父类的初始化。
  4. 当虚拟机启动时,虚拟机会初始化主类(包含main方法的那个类)。

 

被动引用

  1. 通过子类引用父类的静态字段,不会导致子类初始化(对于静态字段,只有直接定义这个字段的类才会被初始化)。
  2. 通过数组定义类应用类:ClassA [] array=new ClassA[10]。触发了一个名为[LClassA的类的初始化,它是一个由虚拟机自动生成的、直接继承于Object的类,创建动作由字节码指令newarray触发。
  3. 常量会在编译阶段存入调用类的常量池。

 

编译器会为接口生成<clinit>()构造器,用于初始化接口中定义的成员变量。一个接口在初始化时,并不要求其父类接口全部完成了初始化,只有在真正使用到父接口的时候才会初始化。


     1、加载

  加载阶段主要完成三件事,即通过一个类的全限定名来获取定义此类的二进制字节流,将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构,在Java堆中生成一个代表此类的Class对象,作为访问方法区这些数据的入口。这个加载过程主要就是靠类加载器实现的,这个过程可以由用户自定义类的加载过程。

  2、验证

  这个阶段目的在于确保Class文件的字节流中包含信息符合当前虚拟机要求,不会危害虚拟机自身安全。主要包括四种验证:

  文件格式验证:基于字节流验证,验证字节流是否符合Class文件格式的规范,并且能被当前虚拟机处理。

  元数据验证:基于方法区的存储结构验证,对字节码描述信息进行语义验证。

  字节码验证:基于方法区的存储结构验证,进行数据流和控制流的验证。

  符号引用验证:基于方法区的存储结构验证,发生在解析中,是否可以将符号引用成功解析为直接引用。

  3、准备

  仅仅为类变量(即static修饰的字段变量)分配内存并且设置该类变量的初始值即零值,这里不包含用final修饰的static,因为final在编译的时候就会分配了,同时这里也不会为实例变量分配初始化。类变量会分配在方法区中,而实例变量是会随着对象一起分配到Java堆中。

  4、解析

  解析主要就是将常量池中的符号引用替换为直接引用的过程。符号引用就是一组符号来描述目标,可以是任何字面量,而直接引用就是直接指向目标的指针、相对偏移量或一个间接定位到目标的句柄。有类或接口的解析,字段解析,类方法解析,接口方法解析。

  这里要注意如果有一个同名字段同时出现在一个类的接口和父类中,那么编译器一般都会拒绝编译。

  5、初始化

  初始化阶段依旧是初始化类变量和其他资源,这里将执行用户的static字段和静态语句块的赋值操作。这个过程就是执行类构造器方法的过程。

  方法是由编译器收集类中所有类变量的赋值动作和静态语句块的语句生成的,类构造器方法与实例构造器方法不同,这里面不用显示的调用父类的方法,父类的方法会自动先执行于子类的方法。即父类定义的静态语句块和静态字段都要优先子类的变量赋值操作。



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JAVA中类的加载过程 的相关文章

随机推荐

  • 城市内涝积水监测预警系统的重要性

    一 系统概述 随着我国城镇化快速发展 城市建设产生的大量地面硬底化 大部分的降雨将形成地表径流 仅有少量雨水渗入地下 导致城市内涝等一系列问题 当前 全国多地发生洪涝 我国南北方全面进入主汛期 需要重点防治暴雨造成的城乡内涝 山体滑坡等安全
  • 【java】高并发之限流 RateLimiter使用

    1 概述 转载原文 高并发之限流 你可能知道高并发系统需要限流这个东西 但具体是限制的什么 该如何去做 还是模凌两可 我们接下来系统性的给它归个小类 希望对你有所帮助 google guava中提供了一个限流实现 RateLimiter 这
  • chmod函数

    int chmod const char pathname mode t mode 作用 修改文件的权限 参数 mode 需要修改的权限值 宏或者八进制数 返回值 成功 0 失败 1 include
  • 线性表顺序存储及相关操作(创建,插入,删除,遍历)

    线性表类型的定义 线性表是由同类数据元素构成的有序序列的线性结构 表中元素个数 n gt 0 称为线性表的长度 n 0时称为空表 在复杂线性表中 一个数据元素可以由若干个数据项 item 组成 这种情况下 常把数据元素称为记录 record
  • Linux 入门笔记(根据传智韩顺平整理的(一))

    开发步骤 1 Vi Hello java 2 输入i进入插入模式 3 输入esc 进入命令模式 4 输入 冒号 wq保存退出 q 退出不保存 5 编译Hello java gt javac Hello java 6 运行 java Hell
  • C++如何显示一个函数被调用的次数

    问题1 如何显示一个函数被调用的次数 使用static关键字 汉诺塔问题局部 void move char src char dest static int n 1 n具有全局寿命 但是局部可见 cout lt
  • 什么是漏洞扫描?

    首先什么是漏洞 国内外各种规范和标准中关于漏洞 也称脆弱性 英文对应Vulnerability 的定义很多 摘录如下 互联网工程任务组RFC4949 1 系统设计 部署 运营和管理中 可被利用于违反系统安全策略的缺陷或弱点 中国国家标准 信
  • 分布式与高并发(一)了解多线程的意义和使用

    了解多线程的意义和使用 什么是线程 并发与高并发 客户端向Tomcat发送请求 在Tomcat中存在多个个并发数 这个并发数由什么决定的 并发 单位时间内能够同时处理的请求数 默认情况下Tomcat可以支持的最大请求数是150 也就是同时支
  • 资深测试老鸟整理,性能测试-常见调优详细,卷起来...

    目录 导读 前言 一 Python编程入门到精通 二 接口自动化项目实战 三 Web自动化项目实战 四 App自动化项目实战 五 一线大厂简历 六 测试开发DevOps体系 七 常用自动化测试工具 八 JMeter性能测试 九 总结 尾部小
  • python报错“No module named xarray”

    在python运行 import xarray as xr 报错 No module named xarray 在命令提示符中显示已安装 一 检查 1 确认 Python 解释器路径 运行以下代码 查看正在使用的 Python 解释器路径
  • python:playwright结合pytest执行用例

    playwright结合Pytest为您的 Web 应用程序编写端到端的测试 安装pytest插件 C Users lifeng01 gt pip install pytest playwright Collecting pytest pl
  • Linux下CMake编译链接线程库以及线程绑定

    CMake编译链接线程库 1 设置链接选项 使用 CMake 编译程序时 需要设置链接选项来链接 pthread 库 在 CMakeLists txt 文件中添加链接选项 即在add executable 下面添加以下代码将 pthread
  • Tomcat性能优化(二)

    六 NIO连接器前端整体框图 1 图解tomcat总体流程 源码详细分析解读见视频 连接器在Tomcat中是一个重要的组件 叫做Tomcat前端 这个前端框架不是通常我们讲的Web前端 那是structs javascript jsp这些内
  • A记录,子域名,CNAME,MX,TXT,SRV

    http zhanghucheng cn post 8 A记录 A Address 记录是用来指定主机名 或域名 对应的IP地址记录 用户可以将该域名下的网站服务器指向到自己的web server上 同时也可以设置您域名的子域名 通俗来说A
  • Git:Unable to negotiate with错误

    今天更新了一下Git版本 发现推送代码的时候提示 Unable to negotiate with xx xx xx xx port 29418 no matching host key type found Their offer ssh
  • JS 如何将数组对象中多个特定值取出形成新数组

    有如下数据 list mainId 581 errMsg null sort null status null nowFarmId null nowPigstyId null insideEarCode MT5687G pigEntityC
  • Linux操作系统原理与应用实验 实验三 实验四 问题总结

    本文是在进行Linux实验三和实验四所遇到的问题或学到的小知识进行总结 以调通程序为内容导向 问题的解决方法或许不难 也都能搜到 但是如果笔者自己总结下来能够节省很多人去搜索解决方法的繁琐步骤 节省大家的时间 实验三 文件操作算法 新版本带
  • gdb调试动态链接库

    转自 http www cnblogs com ybgame archive 2012 03 23 2414078 html 在 Linux 可以用 gdb 来调试应用程序 当然前提是用 gcc 编译程序时要加上 g 参数 我这篇文章里将讨
  • ML学习笔记(二)----交叉验证、偏差和方差分析

    什么是交叉验证 交叉验证是一种模型验证技术 可用于评估统计分析 模型 结果在其它独立数据集上的泛化能力 它主要用于预测 我们可以用它来评估预测模型在实践中的准确度 交叉验证的目标是定义一个数据集 以便于在训练阶段 例如 验证数据集 中测试模
  • JAVA中类的加载过程

    摘自 http soft chinabyte com database 312 12643812 shtml http www cnblogs com yshb archive 2012 11 05 2756194 html 类的生命周期