zoukankan      html  css  js  c++  java
  • 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进制文件

  • 相关阅读:
    Use "Attach to Process" in VC Express 2010
    韩国三日游
    可耻的没通过Autodesk 3ds Max初级认证
    Trace depth and rays per second per core
    References on SSS
    Free Shave SDK
    New wisdom on offline/interactive rendering
    匹配汉字的正则表达式
    WPF中richtextbox的一些用法
    C#中禁止一个程序打开多次
  • 原文地址:https://www.cnblogs.com/snail-gao/p/11756542.html
Copyright © 2011-2022 走看看