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>()

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

相关文章

  • java中使用DES加密解密实例

    java中使用DES加密解密实例

    这篇文章主要介绍了java中使用DES加密解密实例,需要的朋友可以参考一下
    2014-01-01
  • java结合HADOOP集群文件上传下载

    java结合HADOOP集群文件上传下载

    这篇文章主要介绍了java结合HADOOP集群文件上传下载的方法和示例,非常的实用,这里推荐给大家,希望大家能够喜欢。
    2015-03-03
  • Spring实战之ServletContextResource访问资源文件示例

    Spring实战之ServletContextResource访问资源文件示例

    这篇文章主要介绍了Spring实战之ServletContextResource访问资源文件,结合实例形式分析了spring使用ServletContextResource读取与遍历资源文件相关操作技巧,需要的朋友可以参考下
    2019-12-12
  • 解决BufferedReader.readLine()遇见的坑

    解决BufferedReader.readLine()遇见的坑

    这篇文章主要介绍了解决BufferedReader.readLine()遇见的坑,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • SpringBoot使用Redis实现分布式缓存

    SpringBoot使用Redis实现分布式缓存

    这篇文章主要介绍了SpringBoot redis分布式缓存实现过程解析,文中通过示例代码解析的非常详细,感兴趣的同学可以参考阅读
    2023-04-04
  • 详细讲解springboot如何实现异步任务

    详细讲解springboot如何实现异步任务

    异步:异步与同步相对,当一个异步过程调用发出后,调用者在没有得到结果之前,就可以继续执行后续操作。也就是说无论异步方法执行代码需要多长时间,跟主线程没有任何影响,主线程可以继续向下执行
    2022-04-04
  • Java标识接口的使用方法

    Java标识接口的使用方法

    在本篇文章中小编给大家分享了关于Java标识接口的使用方法和教程内容,有需要的朋友们学习下。
    2019-01-01
  • Java实现堆排序和图解

    Java实现堆排序和图解

    如果将堆理解为二叉树,那么树中任一非叶结点的关键字均不大于(或不小于)其左右孩子(若存在)结点的关键字,堆排序的时间复杂度为O(N*logN),这里我们就来详解堆排序算法原理及Java版的代码实现
    2021-07-07
  • Java中的StringTokenizer实现字符串切割详解

    Java中的StringTokenizer实现字符串切割详解

    这篇文章主要介绍了Java中的StringTokenizer实现字符串切割详解,java.util工具包提供了字符串切割的工具类StringTokenizer,Spring等常见框架的字符串工具类(如Spring的StringUtils),需要的朋友可以参考下
    2024-01-01
  • Java自定义注解实现Redis自动缓存的方法

    Java自定义注解实现Redis自动缓存的方法

    本篇文章主要介绍了Java自定义注解实现Redis自动缓存的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-04-04

最新评论