Java类加载基本过程详细介绍

 更新时间:2016年12月14日 17:27:29   投稿:lqh  
这篇文章主要介绍了Java类加载基本过程详细介绍的相关资料,需要的朋友可以参考下

Java类加载基本过程详细介绍

基本过程:

  • 根据类的全限定名称加载定义类的二进制字节流。
  • 将字节流代表的静态存储结构转化为方法区的运行时数据结构
  • 内存中生成一个代表这个类的java.lang.Class对象,作为方法去这个类的各种数据访问入口

 数组类本身不通过类加载器创建,由java虚拟机直接创建,数组类的元素类型由类加载器加载。
数组类的元素类型:数组去掉所有维度后的类型, 

文件格式验证:

  1. 0xCAFEBABY 魔数开头;
  2. 主次版本号当前虚拟机可处理;
  3. 常量类型;
  4. 索引执行类型;
  5. utf8编码数据类型,

元数据验证:字节码描述信息语义分析:

  1. 是否有父类;
  2. 父类是否继承了final修饰的类;
  3. 非抽型类是否实现了父类或接口中需要实现的方法;
  4. 类中的字段、方法的覆盖,重载矛盾;

 字节码验证:通过语义流及控制流分析确定程序予以的合法性,正确性,方法体分析验证。

  1. 符号引用验证:虚拟机将符号引用转化为直接引用时候,解析阶段,对类自身以外信息进行匹配性验证
  2. 符号引用中通过字符描述的全限定名是否能找到对应的类;
  3. 指定类中是否存在符合方法字段的描述符,及简单名称所描述的方法和字段;
  4. 符号引用中类,字段,方法的访问性。

准备:在方法区中为类变量分配内存及设置类变量初始值。

  1. 初始值通常为数据类型的零值,final修饰的值直接初始化为相应值。
  2. 类变量为static修饰的变量,区分于实例变量。

 解析:虚拟机将常量池中的符号引用替换为直接引用过程

CONSTANT_Class_info,CONSTANT_Fieldref_info,CONSTANT_Methodref_info..

  1. 符号引用:以一组符号来描述所引用的目标,任何形式的字面量,只要使用时能无歧义的定位到目标,,与虚拟机内存实现无关,无关引用目标是否加载。
  2. 直接引用:直接指向目标的指针,偏移量或间接定位到目标的句柄,和虚拟机实现的内存相关,直接引用相关的目标对象必须已加载。
  3. 。。。

初始化:开始执行类定义中的Java程序代码。执行类构造器<cinit>()方法,

<cinit>():

  1. 编译器根据类文件中定义顺序自动收集类中的类变量的赋值动作和静态语句块儿的语句合并产生,静态语句块儿只能访问到其前定义的变量。
  2. 区别于类的构造方法,不需要显示的调用父类构造器,虚拟机保证子类的<cinit>()执行之前父类的<cinit>()已经执行完成。
  3. 父类中的静态语句块儿执行于前。
  4. <cinit>()对于类或接口不是必须的,如果没有变量赋值操作或静态语句块儿,则不生成。
  5. 接口的<cinit>()不需要先执行父接口的<cinit>(),同样接口的实现类<cinit>()也不需要。
  6. 线程安全:虚拟机保证多线程环境中<cinit>()正确的加锁,同步,同一时间只能有一个线程访问初始化类的<cinit>()

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

  • Spring Boot面试必问之启动流程知识点详解

    Spring Boot面试必问之启动流程知识点详解

    SpringBoot是Spring开源组织下的子项目,是Spring组件一站式解决方案,主要是简化了使用Spring的难度,简省了繁重的配置,提供了各种启动器,开发者能快速上手,这篇文章主要给大家介绍了关于Spring Boot面试必问之启动流程知识点的相关资料,需要的朋友可以参考下
    2022-06-06
  • springboot连接sqllite遇到的坑及解决

    springboot连接sqllite遇到的坑及解决

    这篇文章主要介绍了springboot连接sqllite遇到的坑及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • 一文详解Mybatis-plus的介绍与使用

    一文详解Mybatis-plus的介绍与使用

    Mybatis-Plus 是 MyBatis 的一个增强工具,专门针对于传统MyBatis开发中sql需要手动进行映射配置繁琐缺点的一款框架技术。本文将为大家详细讲讲Mybatis-plus的介绍与使用,感兴趣的可以了解一下
    2022-07-07
  • Java 按行读取文件按行写入文件并以空格分割字符串的方法

    Java 按行读取文件按行写入文件并以空格分割字符串的方法

    今天小编就为大家分享一篇Java 按行读取文件按行写入文件并以空格分割字符串的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • Java实现拓扑排序算法的示例代码

    Java实现拓扑排序算法的示例代码

    在图论中,拓扑排序(Topological Sorting)是一个有向无环图(DAG, Directed Acyclic Graph)的所有顶点的线性序列。本文将为大家讲讲拓扑排序算法的原理及实现,需要的可以参考一下
    2022-07-07
  • SpringBoot上传文件大小受限问题的解决办法

    SpringBoot上传文件大小受限问题的解决办法

    最近有一次由于项目升级发现了一个上传方面的问题,下面这篇文章主要给大家介绍了关于SpringBoot上传文件大小受限问题的解决办法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-05-05
  • 初识Java8中的Stream

    初识Java8中的Stream

    lambda表达式是stream的基础,接下来通过实例代码给大家详细介绍java8中的stream,感兴趣的朋友一起看看吧
    2017-08-08
  • 基于Java实现音乐播放器的示例代码

    基于Java实现音乐播放器的示例代码

    这篇文章主要为大家详细介绍了如何利用Java编写一个简单的音乐播放器,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以了解一下
    2023-07-07
  • Spring TransactionalEventListener事务未提交读取不到数据的解决

    Spring TransactionalEventListener事务未提交读取不到数据的解决

    这篇文章主要介绍了Spring TransactionalEventListener事务未提交读取不到数据的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • SpringBoot创建监听器的方法示例

    SpringBoot创建监听器的方法示例

    在Java中,监听器(Listener)是一种设计模式,它允许对象在 特定事件 发生时 自动执行某些操作,这种设计模式通常用于实现 发布-订阅模型,本文给大家介绍了SpringBoot创建监听器的方法示例,感兴趣的通过可以参考一下
    2024-04-04

最新评论