`

java类文件结构

    博客分类:
  • JVM
阅读更多
1.虚拟机并不关心Class的来源是什么语言,只要符合Class文件应有的结构就可以在java虚拟机中运行。(例如java源程序和JRuby源程序都可以通过各自的编译器编译成.class文件运行在java虚拟机上。)

     Class文件是一组以8位字节为基础单位的二进制流。Class文件结构采用类C语言的伪结构,这种伪结构只有两种数据类型:无符号数和表。

     无符号数属于基本数据类型,u1,u2,u4,u8分别代表1个字节,2个字节,4个字节,8个字节。表是由多个无符号数或其他表作为数据项构成的复合数据类型。

     当需要描述同一类型但数量不定的多个数据时,经常会使用一个前置的容量计数器加若干连续的数据项的形式。

Class文件的前4个字节为魔数,值为"0xCAFEBASE",被虚拟机识别。第5个6个字节为次版本号,7,8个字节为主版本号。高版本的jdk能向下兼容低版本的Class文件,但不能运行以后的class文件。

常量池:
    主版本和次版本之后的是常量池。常量池入口处为u2类型的常量池计数器(constant_pool_count),计数从1开始。常量池主要存放两大类常量:字面量(文本字符串、被声明为final的常量值)和符号引用。符号引用主要指:
类和接口的全限定名、字段的名称和描述、方法的名称和描述符。
当虚拟机运行时,需要从常量池获得对应的符号引用,在类创建时或运行时解析并翻译到具体的内存中。

访问标志:常量池结束之后的2个字节表示访问标志(access_flag),用于识别类和接口层次的信息。如:这个Class是类还是接口,是否定义为public类型,是否定义为abstract类型,是否声明为final类型等等。

类索引、父类索引与接口索引:
   类索引和父类索引都是一个u2类型的数据,而接口索引是一组u2类型的数据的集合。类索引用于确定这个类的全限定名,父类索引用于确定这个类的父类的全限定名。接口索引集合就是用来确认这个类实现了哪些接口。类索引、父类索引和接口索引集合都按顺序排列在访问标志之后。

字段表集合:
    字段表用于描述接口或类中声明的变量,可以包含的信息有字段的作用域(public,protected,private),是类级变量(static)还是实例级变量,
    final以及并发可见性(volatile)、是否序列化。
    字段表中的access_flag与类中的access_flag项目非常类似,跟随access_flag标志的是name_index和descriptor_index,它们都是对常量池的引用,
分别代表字段的简单名称及字段和方法的描述符。 如:com/test/latty/TestClass为类的全限定名,简单名称就是没有类型或参数修饰的方法或字段名称如:类中inc()方法
和m字段的简单名称分别为"inc"和"m"。

描述符是用来描述字段的数据类型、方法的参数列表和返回值。

对于数组类型,每一纬度使用"["来表示。 如java.lang.String[][]类型的描述符为"[[Ljava/lang/String;",方法"void inc()"的描述符为"()V",
方法java.lang.String toString方法的描述符为"()Ljava/lang/String;"

字段表集合不会列出超类或者从父接口中继承而来的字段。

方法表的集合:
方法表的结构如同字段表一样依次包含了access_flags,名称索引(name_index)、索引符索引(descriptor_index)、属性表集合(attributes).
方法里的java代码,经过编译器编译成字节码指令之后,存放在方法属性表集合中一个名为"Code"的属性中。
要重载一个方法,必须有一个与原方法不同的特征签名,特征签名就是一个方法中各个参数在常量池中字段符号引用的集合。

属性表集合:
属性表集合不要求长度和顺序等,只要不与已有属性名重复,任何人都可以向属性表中写入自己定义的属性信息。
        Code属性:方法体里面的代码经过编译成的字节码指令存储在Code属性中。Code属性出现在方法表的属性集合中。
        Code属性表中max_stack代表了操作树栈深度的最大值,max_locals:代表了局部变量表所需的存储空间。存储单位是Slot
        长度不超过32位的局部变量,每个局部变量占用1个Slot,double和long两种64位的数据类型需要2个Slot来存储。
        code_length:code属性表中代表字节码长度,是一个u4类型,限制了一个方法不能超过65535条字节码指令,如果超出,javac编译器拒绝编译。
       


分享到:
评论

相关推荐

    java类文件结构(笔记).docx

    Java 类文件结构是Java虚拟机(JVM)执行的基础,它包含了构成Java程序的所有必要信息。Class文件是一种二进制格式,由8位字节组成,数据紧密排列,没有额外的分隔符,确保高效存储。Class文件由一系列的数据项组成...

    java 随机读写Java类文件

    10. **学习资源**:理解类文件格式的官方文档是《Java Virtual Machine Specification》,而深入学习`RandomAccessFile`可以查阅Java API文档。此外,相关的书籍和在线教程也能提供深入的理论和实践指导。 总之,...

    java所有类结构(pdf文件)

    这份"java所有类结构"的PDF文档提供了全面的Java类层次结构,对于深入学习Java编程至关重要。以下将详细介绍PDF文档中可能涉及的一些重要Java类和概念。 首先,`java.awt.font.Font`类是处理字体的基础,它允许程序...

    Java文件结构解析工具

    一个简单的分析工具,用于分析”.class/.cap/.exp”格式的Java文件。 对于CAP文件,支持version 2.1 and 2.2. 适用于JCVM的学习。 使用工具时,需保证“C:\Program Files\WinZip\WINZIP32.EXE”存在,用于解压CAP...

    JAVA项目文件结构与配置文档(干货)

    在Java项目开发中,构建一个合理的文件结构与配置文档至关重要,因为它直接影响到项目的可维护性、扩展性和团队协作效率。本文将深入解析一个典型的Java项目文件结构及其配置,以帮助开发者理解和建立规范化的项目...

    java class文件编译

    Java源代码(.java文件)在经过Java编译器(javac)处理后,会生成对应的Class文件。Class文件采用一种特殊的二进制格式,这种格式具有固定结构,主要包括以下几个部分: 1. 魔数:标识文件为Java类文件,固定为0...

    java 生成文件结构目录树

    使用纯java代码遍历文件夹,生成一个文件夹目录结构的目录树。 及返回一个包含有 id(文件夹id) fid(当前文件夹父目录文件夹id) name (文件/文件夹路径)的集合对象。可根据这个结果传到前台,通过jquery.ztree 或是...

    JAXB 利用xsd文件生成java类

    - JAXB会解析XML并创建相应的Java对象层次结构,保持与XML文档结构的一致性。 5. **JAXB与Maven/Gradle集成**: - Maven可以通过`maven-jaxb2-plugin`或`jaxb2-maven-plugin`插件实现XSD到Java的编译。 - Gradle...

    JAVA版数据结构.pdf

    根据提供的文件信息,本部分将对“JAVA版数据结构.pdf”中的内容进行知识点的详细说明。 1. 数据结构基础概念 文中提到了数据结构(Data Structures)和Java语言的结合,这表明文档可能涉及数据结构在Java中的实现...

    MySQL表自动生成Java实体类

    7. **运行脚本/工具**: 执行这个自动化过程,生成的Java实体类文件将被放置在指定的输出路径下,可以直接引入到Java项目中使用。 通过这样的自动化过程,开发者可以从繁琐的手动编码工作中解脱出来,专注于业务逻辑...

    java 读取表结构 mysql

    在Java编程中,读取MySQL数据库的表结构是一项常见的任务,尤其在开发数据管理或数据分析应用时。这个过程涉及到连接数据库、执行SQL查询以及解析返回的结果集。下面将详细讲解如何实现这一功能。 首先,我们需要...

    java遍历文件目录生成树结构txt文件

    在Java编程中,遍历文件目录并生成树结构的文本文件是一个常见的任务,尤其是在处理大量文件数据时。这个任务可以通过使用Java的`java.io.File`类及其相关API来实现。`Dir.class`和`Dir.java`是这次操作的核心文件,...

    JavaClass文件的结构分析及其校验.pdf

    Java文件校验器通过四次独立扫描完成校验工作: 1. **Class文件的结构检查**:在类装载时执行,主要检查Class文件的内部结构是否符合标准,以保证文件的安全编译。 2. **类型数据的语义检查**:在连接过程中进行,...

    Java自动生成Mysql数据库结构

    总的来说,“Java自动生成Mysql数据库结构”是一项实用的开发工具,它结合了Java编程、数据库管理和文档自动化,体现了IT行业的效率提升理念。通过持续优化,它可以成为数据库管理员和开发者的得力助手,使得数据库...

    把wsdl文件转换成java类 使用wsdl2Java工具

    为了在Java环境中与这些Web服务交互,我们需要将WSDL文件转换为Java类,这就是`wsdl2java`工具的作用。 `wsdl2java`是Apache Axis项目的一部分,它是一个强大的工具,可以自动生成Java客户端和服务端代码,这些代码...

    Java API文档.docx

    Java API文档是Java开发者不可或缺的参考资料,它详细记录了Java编程语言的标准库,包括类、接口、方法和属性等核心元素。这些文档不仅提供技术规格,还包含使用示例,帮助程序员理解和应用Java的各类功能。 1. **...

    java树形结构

    在Java中,实现树形结构通常有两种主要方式:通过继承自Java集合框架的`TreeSet`或`TreeMap`类,或者自定义节点类来构建树。`TreeSet`和`TreeMap`利用红黑树(Red-Black Tree)实现,提供了自动排序的功能。而自定义...

    java知识结构图下载

    java知识结构图

    Java类文件的基本结构_.docx

    以下是对Java类文件基本结构的详细解析: 1. 魔法数(Magic Number)和版本号(Version) 类文件的起始4字节是固定的魔数0xCAFEBABE,用于识别文件是否为Java类文件。紧接着的4字节是大版本号和小版本号,它们标识...

    Java帮助文档.pdf

    Java API(Java Application Programming Interface,Java应用程序接口)是Java语言提供的组织成包结构的许多类和接口的集合,提供了极大的便利给用户编写应用程序。Java帮助文档中提供了Java API的详细说明文档,...

Global site tag (gtag.js) - Google Analytics