• Class 文件简介


    Class 文件结构

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

    Class 文件只有两种数据类型:无符号数(基础类型)和表(引用类型)

    • 魔数
      校验文件类型的。例如java:cafababa

    • 版本

      • JDK1.8 = 52
      • JDK1.8 = 51
    • Class文件版本

    • 常量池

    Constant Type Value
    CONSTANT_Class 7
    CONSTANT_Fieldref 9
    CONSTANT_Methodref 10
    CONSTANT_InterfaceMethodref 11
    CONSTANT_String 8
    CONSTANT_Integer 3
    CONSTANT_Float 4
    CONSTANT_Long 5
    CONSTANT_Double 6
    CONSTANT_NameAndType 12
    CONSTANT_Utf8 1
    CONSTANT_MethodHandle 15
    CONSTANT_MethodType 16
    CONSTANT_InvokeDynamic 18
    • 访问标志
    • 类索引,父类索引,接口索引集合
    • 字段表集合
    • 方法表集合
    • 属性表集合

    Class 文件格式

    u 代表基本信息, info代表复合信息
    

    cp_info格式:

    cp_info {
        u1 tag;
        u1 info[];
    }
    
    ClassFile {
        u4 magic; // 魔法数字,表明当前文件是.class文件,固定0xCAFEBABE
        u2 minor_version; // 分别为Class文件的副版本和主版本,最小版本
        u2 major_version; //最大版本
        u2 constant_pool_count; // 常量池计数
        cp_info constant_pool[constant_pool_count-1]; //
        u2 access_flags; // 类访问标识
        u2 this_class; // 当前类
        u2 super_class; // 父类
        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; // 属性数量
        attribute_info attributes[attributes_count]; // 各种属性
    }
    

    常量池对照表(对应cp_info的tag):

    Constant Type Value
    CONSTANT_Class 7
    CONSTANT_Fieldref 9
    CONSTANT_Methodref 10
    CONSTANT_InterfaceMethodref 11
    CONSTANT_String 8
    CONSTANT_Integer 3
    CONSTANT_Float 4
    CONSTANT_Long 5
    CONSTANT_Double 6
    CONSTANT_NameAndType 12
    CONSTANT_Utf8 1
    CONSTANT_MethodHandle 15
    CONSTANT_MethodType 16
    CONSTANT_InvokeDynamic 18

    参考网址:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html

    ps:目标:根据代码可以手写class2进制文件

  • 相关阅读:
    尤瓦尔•赫拉利简史三部曲读书笔记
    5星|《城市与国家财富》:经济发展的基本单位是城市而不是国家
    oracle SQL Develop导出数据库中的表格数据到excel
    selvert的过滤器filter处理中文乱码
    jsp中四种传递参数的方法
    Mybatis中配置Mapper的方法
    JAVA文件中获取路径及WEB应用程序获取路径方法
    MyEclipse 常用设置
    Java连接oracle数据库的OCI和thin
    Java连接oracle数据库的OCI和THIN
  • 原文地址:https://www.cnblogs.com/snail-gao/p/11756542.html
Copyright © 2020-2023  润新知