• JVM类文件结构


    Class文件结构:
    Class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在Class文件之中,中间没有添加任何分隔符,这使得整个Class文件中存储的内容几乎全部是程序运行的必要数据,没有空隙存在。当遇到需要占用8位字节以上空间的数据项时,则会按照高位在前(最高位字节在地址最低位,最低位字节在地址最高位)的方式分隔若干个8位字节进行存储。

    class-file {
        u4             magic;//魔术数
        u2             minor_version;//小版本号
        u2             major_version;//大版本号
        u2             constant_pool_count;//常量池中常量个数+1
        cp_info        constant_pool[constant_pool_count-1];//常量池
        u2             access_flags;//类的访问控制符标识(public,static,final,abstract等)
        u2             this_class;//该类的描述(值为对常量池的引用,引用的值为CONSTANT_Class_info)
        u2             super_class;//父类的描述(值为对常量池的引用,引用的值为CONSTANT_Class_info)
        u2             interfaces_count;//接口数量
        u2             interfaces[interfaces_count];//接口的描述(每个都是对常量池的引用)
        u2             fields_count;//变量数,包括该类中或接口中类变量和实例变量
        field_info     fields[fields_count];//变量表集合
        u2             methods_count;//方法数,包括该类中或接口中定义的所有方法
        method_info    methods[methods_count];//方法表集合
        u2             attributes_count;//属性数,包括InnerClasses,EnclosingMethod,SourceFile等
        attribute_info attributes[attributes_count];//属性表集合
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    魔数

    0-3字节,表示它是否是【class】类型文件

    4-7字节表示类的版本

    u4 magic

    对应字节码文件的0~3个字节

    0000000 ca fe ba be 00 00 00 34 00 23 0a 00 06 00 15 09

    版本

    u2 minor_version;

    u2 major_version;

    0000000 ca fe ba be 00 00 00 34 00 23 0a 00 06 00 15 09

    34H = 52,代表JDK8

    常量池

    由于常量池中常量的数量是不固定的,所以在常量池的入口需要放置一项u2类型的数据,代表常量池容量计数值(constant_pool_count)。这个容量计数是从1而不是0开始的,将第0位常量空出来是由特殊考虑的,这样做的目的在于满足后面某些指向常量池的索引值的数据在特定情况下需要表达“不引用任何一个常量池项目”的含义。

    常量池中主要存放两大类常量:字面量(Literal)和符号引用(Symbolic Reference)。字面量比较接近Java语言层面的常量概念,如文本字符串,声明为final的常量值等。而符号引用则属于编译原理方面的概念,包括下面三种常量:

    • 类和接口的全限定名(Fully Qualified Name)
    • 字段的名称和描述符(Descriptor)
    • 方法的名称和描述符

    38-9字节表示常量池长度

    访问标志

    常量池结束后的俩字节代表访问标志

  • 相关阅读:
    【zabbix监控三】zabbix之部署代理服务器
    Ruo-Yi 前后端分离如何不登录直接访问以及一种基于配置文件实现的方式
    Apache ShenYu 网关正式支持 Dubbo3 服务代理
    如何在Python中处理日期和时间相关问题
    如何确保面试流程标准化操作,避免人为因素影响**
    机器学习笔记(二)回归
    通过融合UGV的地图信息和IMU的惯性测量数据,实现对车辆精确位置和运动状态的估计和跟踪研究(Matlab代码实现)
    猿创征文|Docker实战:docker 安装mongodb
    Loadrunner结合Fiddler实现脚本的录制
    【设计模式学习02】创建者模式之单例、工厂、原型、建造者模式
  • 原文地址:https://blog.csdn.net/Array_new/article/details/127949605