JVM的基础,class文件的理解(2)

本文是“深入学习JVM”系列的第二篇文章,主要介绍class文件的数据结构。
我是蚊子码农,欢迎各位的点赞、关注和收藏,有了你们的激励,我会带来更好的作品。

一、前言

class文件,通常由Java编译器编译得到,用于JVM的工作。
我们按功能研究其数据结构。
不过,我们首先要知道,class文件用无符号整型表示所有数据。
为了方便组织,用多个无符号整型,组成一张表。
整个class文件,本质上就是一张表。

二、概括

按照功能,class文件可以被分为9个数据区,分别是

  1. 魔数 – 验证class文件的正确性;
  2. 版本号 – 标识生成class文件的编译器版本;
  3. 常量池 – 最重要的地方,大多数数据的存储位置;
  4. 访问标识 – 描述这个资源是类还是接口,访问的权限是public、private等,
  5. 类索引 – 描述这个类的全限定名;
  6. 父类索引、接口索引集合 – 描述这个类的父子结构
  7. 字段表 – 描述这个类定义的成员变量和变量属性;
  8. 方法表 – 描述这个类定义的方法和方法属性;
  9. 属性表 – 描述class文件的附带信息;

三、按功能详解class文件

第一,魔数
  1. 功能:用于验证class文件正确性
第二,版本号
  1. 功能:说明编译class文件的编译器的版本。
  2. 原因:高级编译器生成的class文件,无法由低级JVM执行。【即:保证运行成功】
第三,常量池
  1. 功能:存放大量常量资源。
  2. 组成:
    1. 常量池计数器:记录常量池中有多少个常量【从1开始,1表示没有常量】
    2. 常量池数组:真实的常量值。
第四,访问标识
  1. 功能:描述当前类(或接口)的访问修饰符【比如public、private、识别当前文件是类还是接口等等】
第五,类索引
  1. 功能:确定该类的全限定名
第六,父类索引和接口索引集合
  1. 功能:确定这个类的父类的全限定名,和所有实现接口的全限定名
  2. 备注:由于Java是单继承,多实现,所以允许实现多个接口,因此,采用数组的结构,存储接口索引;
  3. 接口索引集合的组成:
    1. 接口计数器:记录显式接口索引的个数【显式接口:也就是在Java源文件中,我们实现的接口,比如我们implements接口A,A可能有个父接口B,B就不属于显式接口】
    2. 接口索引表数组:存放接口信息
第七,字段表集合
  1. 功能:描述接口或类中声明的变量【包括所有显式变量】
  2. 备注:不会列出从父类、实现的接口中继承的字段【但是由于Java有内部类的机制,所以为了保持访问性,可能会有不存在的字段】
  3. 字段表集合的组成:
    1. 字段计数器:记录字段的个数;
    2. 字段表数组:存放字段信息
第八,方法表集合
  1. 功能:描述接口或类中声明的方法;
  2. 备注:不会列出父类父接口的方法,除非本类重写了它们的方法。
  3. 组成:
    1. 方法计数器:记录方法的个数;
    2. 方法表:存放方法信息
第九,属性表
  1. 功能:描述class文件所携带的辅助信息,在JVM运行时,会使用这些信息进行某些活动

四、结语

我是蚊子码农,如有补充或者疑问,欢迎在评论区留言。个人的知识体系可能没有那么完善,希望各位多多指正,谢谢大家。

相关推荐

  1. JVM基础class文件理解2

    2024-07-13 00:28:02       22 阅读
  2. 详细说说JVMclass文件(一)

    2024-07-13 00:28:02       36 阅读
  3. 说说JVMclass文件(二)

    2024-07-13 00:28:02       37 阅读
  4. 下载jar中classes文件

    2024-07-13 00:28:02       60 阅读
  5. 理解JVM常量池

    2024-07-13 00:28:02       31 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-13 00:28:02       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-13 00:28:02       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-13 00:28:02       57 阅读
  4. Python语言-面向对象

    2024-07-13 00:28:02       68 阅读

热门阅读

  1. Onnx 1-深度学习-概述1

    2024-07-13 00:28:02       26 阅读
  2. WPF透明置顶窗口wine适配穿透问题解决

    2024-07-13 00:28:02       23 阅读
  3. qt explicit 啥意思

    2024-07-13 00:28:02       26 阅读
  4. 【spring boot项目】mybatis-plus配置类

    2024-07-13 00:28:02       20 阅读
  5. Unity3D中UI层级改变详解

    2024-07-13 00:28:02       24 阅读
  6. Gunicorn多进程指南:让Web应用跑得更快

    2024-07-13 00:28:02       21 阅读
  7. 深入探索Vite的热更新(HMR)实现

    2024-07-13 00:28:02       23 阅读
  8. springboot中抽离日志

    2024-07-13 00:28:02       18 阅读
  9. 《C++并发编程实战》笔记(一、二)

    2024-07-13 00:28:02       20 阅读
  10. 极速目标检测:算法加速的策略与实践

    2024-07-13 00:28:02       18 阅读