Java类加载基本过程详细介绍
作者:lqh 发布时间:2023-04-15 10:54:14
Java类加载基本过程详细介绍
基本过程:
根据类的全限定名称加载定义类的二进制字节流。
将字节流代表的静态存储结构转化为方法区的运行时数据结构
内存中生成一个代表这个类的java.lang.Class对象,作为方法去这个类的各种数据访问入口
数组类本身不通过类加载器创建,由java虚拟机直接创建,数组类的元素类型由类加载器加载。
数组类的元素类型:数组去掉所有维度后的类型,
文件格式验证:
0xCAFEBABY 魔数开头;
主次版本号当前虚拟机可处理;
常量类型;
索引执行类型;
utf8编码数据类型,
元数据验证:字节码描述信息语义分析:
是否有父类;
父类是否继承了final修饰的类;
非抽型类是否实现了父类或接口中需要实现的方法;
类中的字段、方法的覆盖,重载矛盾;
字节码验证:通过语义流及控制流分析确定程序予以的合法性,正确性,方法体分析验证。
符号引用验证:虚拟机将符号引用转化为直接引用时候,解析阶段,对类自身以外信息进行匹配性验证
符号引用中通过字符描述的全限定名是否能找到对应的类;
指定类中是否存在符合方法字段的描述符,及简单名称所描述的方法和字段;
符号引用中类,字段,方法的访问性。
准备:在方法区中为类变量分配内存及设置类变量初始值。
初始值通常为数据类型的零值,final修饰的值直接初始化为相应值。
类变量为static修饰的变量,区分于实例变量。
解析:虚拟机将常量池中的符号引用替换为直接引用过程
CONSTANT_Class_info,CONSTANT_Fieldref_info,CONSTANT_Methodref_info..
符号引用:以一组符号来描述所引用的目标,任何形式的字面量,只要使用时能无歧义的定位到目标,,与虚拟机内存实现无关,无关引用目标是否加载。
直接引用:直接指向目标的指针,偏移量或间接定位到目标的句柄,和虚拟机实现的内存相关,直接引用相关的目标对象必须已加载。
。。。
初始化:开始执行类定义中的Java程序代码。执行类构造器<cinit>()方法,
<cinit>():
编译器根据类文件中定义顺序自动收集类中的类变量的赋值动作和静态语句块儿的语句合并产生,静态语句块儿只能访问到其前定义的变量。
区别于类的构造方法,不需要显示的调用父类构造器,虚拟机保证子类的<cinit>()执行之前父类的<cinit>()已经执行完成。
父类中的静态语句块儿执行于前。
<cinit>()对于类或接口不是必须的,如果没有变量赋值操作或静态语句块儿,则不生成。
接口的<cinit>()不需要先执行父接口的<cinit>(),同样接口的实现类<cinit>()也不需要。
线程安全:虚拟机保证多线程环境中<cinit>()正确的加锁,同步,同一时间只能有一个线程访问初始化类的<cinit>()
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


猜你喜欢
- 1、 题外话 相信大家对LayoutInflate都不陌生,特别在ListView的Adapter的getV
- 本文实例为大家分享了android实现倒计时动态圈的具体代码,供大家参考,具体内容如下效果是这样,没动图:布局:<LinearLayo
- using System;using System.Collections.Generic;using System.Linq;using
- 本文实例为大家分享了Viewpager2实现登录注册引导页面的具体代码,供大家参考,具体内容如下介绍屏幕滑动是两个完整屏幕之间的切换,在设置
- 前言学习了关于集合类的知识,我们可以做一个小项目来加深对集合类知识的学习!一、项目要求代码实现,一副扑克牌(不包括大小王)的购买、打乱、发牌
- 想必大家都知道,国内的Android应用基本都是免费的
- 本文实例讲述了C#中datagridview的EditingControlShowing事件用法。分享给大家供大家参考。具体实现方法如下:u
- 代码如下import java.util.concurrent.Callable;import java.util.concurrent.E
- 第一步:图形验证码接口1.使用第三方的验证码生成工具Kaptchahttps://github.com/penggle/kaptcha@Co
- 本文实例讲述了WinForm生成验证码图片的方法。分享给大家供大家参考,具体如下:1、创建ValidCode类:public class V
- 前言介绍了几篇 Hero 动画,我们来一个 Hero 动画应用案例。在一些应用中,列表的元素和详情的
- 概念 基本映射是对一个实体进行映射,关联映射就是处理多个实体之间的关
- 本章概要返回JSON数据静态资源访问返回JSON数据默认实现JSON 是目前主流的前后端数据传输方式,Spring MVC中使用消息转换器H
- 概述Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,
- 下面通过图文并茂的方式给大家分享C#实现KTV点歌系统。public enum SongPlayState { //未播放,播放
- 当我们需要在Unity客户端做一个限制功能,比如按钮 (最好是发送验证码按钮)要求每天只能点击三次,等到第二天又有三次机会,这个过程不涉及到
- StopWatch是位于org.springframework.util包下的一个工具类,通过它可方便的对程序部分代码进行计时(ms级别),
- 1、实现原理不同过滤器和 * 底层实现方式大不相同,过滤器 是基于函数回调的, * 则是基于Java的反射机制( * )实现的。1、拦
- 在android开发中,有时候我们想获取手机的一些硬件信息,比如android手机的总内存和可用内存大小。这个该如何实现呢?通过读取文件&q
- 主要介绍:1.任务队列2.拒绝策略(抛出异常、直接丢弃、阻塞、临时队列)3.init( min )4.active5.maxmin<=