zoukankan      html  css  js  c++  java
  • 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虚拟机》
  • 相关阅读:
    Oracle常用命令大全(很有用,做笔记)
    表格驱动编程在代码中的应用
    mac 利用svn下载远程代码出现Agreeing to the Xcode/iOS license requires admin privileges, please re-run as root via sudo.
    FAILURE: Build failed with an exception.
    There is an internal error in the React performance measurement code.Did not expect componentDidMount timer to start while render timer is still in progress for another instance
    react native TypeError network request failed
    Android向系统相册中插入图片,相册中会出现两张 一样的图片(只是图片大小不一致)
    react-native Unrecognized font family ‘Lonicons’;
    react-native SyntaxError xxxxx/xx.js:Unexpected token (23:24)
    Application MyTest has not been registered. This is either due to a require() error during initialization or failure to call AppRegistry.registerComponent.
  • 原文地址:https://www.cnblogs.com/jqctop1/p/7820410.html
Copyright © 2011-2022 走看看