• Java class文件的结构


    Java class文件的结构

    class文件是Java源代码编译之后产生的二进制文件,代码中的各个项目严格按照Java的规范组织。
    class文件以一张表的形式组织代码中的各个部分:

    名称 释义 大小
    magic 魔数 4 Byte
    minor_version 子版本号 2Byte
    major_version 主板本号 2Byte
    constant_pool_count 常量池的大小 2Byte
    constant_pool 常量池 由constant_pool_count决定
    access_flags 访问标志位 2Byte
    this_class 类索引 2Byte
    super_class 父类索引 2Byte
    interfaces_count 实现接口的数目 2Byte
    interfaces 实现的接口 由interfaces_count决定
    fields_count 成员变量的数目 2Byte
    fields 成员变量 由fields_count决定
    methods_count 方法数 2Byte
    methods 方法 由methods_count决定
    attributes_count 属性数 2Bytes
    attributes 属性 由attributes_count决定

    魔数

    magic(魔数)的作用是用于识别文件类型是否是class文件,class文件的魔数是0xCAFEBABE 。

    版本号

    minor_version和major_version用于标记该class文件是由哪个版本的Java编译器编译而来。由低版本的Java编译器编译产生的class文件可以运行在高版本的虚拟机上,即向下兼容,但虚拟机不能执行超过自身版本的class文件,即使高版本class文件除了版本号以外其他内容与低版本class文件完全相同。

    常量池

    constant_pool(常量池)主要用于存放Class中的字面常量(literal)以及符号常量 。字面常量包括:Class中的字符串常量、声明为final的值。符号常量主要包括:类的全限定名、成员变量的名称和描述符、方法的名和描述符。
    常量池由多个常量表组成,每个常量表保存一种常量,如:int型常量表保存的都是int类型的常量,字符串类型常量表保存所有String类型的常量。Java 7 之前共有11种不同的常量表,自 Java 7 开始新增3种常量表。

    访问标志位

    access_flags用于保存Class以及Interface的访问标志,包括Class访问限定类型是public、protected、private中的一种,是否final、abstract的Class等。

    类索引、父类索引以及接口索引

    this_class(类索引)用于确定该类的全限定名,super_class(父类)用于确定父类的的全限定名,interfaces(接口索引)用于确定该类实现的所有接口的全限定名。它们的值指向常量池中的对应常量。

    成员变量

    fields (成员变量)用于保存Class中的所有成员变量,包括static变量和instance变量。Class中的所有成员变量以一张表格的形式存储,存储了成员变量的访问标志位、变量名索引、变量描述符索引、变量属性等信息。
    需要注意的是,fields中不会包含从父类中继承来的成员变量。

    方法

    methods(方法)用于保存Class中声明的所有方法,包括static方法和instance方法。Class中的所有方法也是以一张表格的形式存储,存储的信息也主要是:方法访问标志位、方法名索引、方法描述符索引、方法属性等信息。如果父类的方法没有被子类覆盖,子类的methods中也不会出现父类的方法。

    属性

    attributes(属性)用于保存Class中成员变量或者方法的详细特有信息。每个field或者method中都可以包含一个属性表,用于描述该成员变量或者方法的详细信息。
    属性由多个属性表组成,每个属性表包含一种特定类型的属性。最常见的几个属性类型如下表:

    名称 含义 使用位置
    Code 方法的字节码指令 methods(方法表)
    ConstantsValue final定义的常量值 fields(字段表)
    Exceptions 方法抛出的异常表 methods(方法表)
    LineNumberTable 源代码行号与字节码指令的映射关系表 Code
    LocalVariableTable 局部变量表 methods (方法表)

    参考资料:《深入理解Java虚拟机》
  • 相关阅读:
    python面向编程:阶段练习
    python面向编程:面向对象、init、绑定方法、案例练习
    python常用模块:re模块案例、subprocess
    分享知识-快乐自己:FastDFS 图片服务器的搭建
    分享知识-快乐自己:Nginx概述及如何使用
    分享知识-快乐自己:Java中各种集合特点
    分享知识-快乐自己:虚拟机克隆
    分享知识-快乐自己:安装虚拟机详细步骤
    分享知识-快乐自己:虚拟机 NET 网络配置
    分享知识-快乐自己:IO流基本操作
  • 原文地址:https://www.cnblogs.com/jqctop1/p/7820410.html
Copyright © 2020-2023  润新知