`

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文件结构解析工具

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

    java所有类结构(pdf文件)

    pdf文档里面包含java所有类结构,对于java学习很有帮助

    java 生成文件结构目录树

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

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

    JAVA项目开发架构,此文档结构新建一个项目需要考虑哪些因素,怎么建,中间需要哪些文件夹等

    java 读取表结构 mysql

    java 读取表结构 mysql 数据库名: 表名: 字段描述 字段名 数据类型 是否可为空 自增 主键

    java知识结构图下载

    java知识结构图

    <Java_4>文件的树形结构

    用Java实现文件树形结构的显示 (主要用于我的博文的代码资源下载)

    Java数据结构和算法

    Java数据结构和算法 Java数据结构和算法 Java数据结构和算法 Java数据结构和算法 Java数据结构和算法 Java数据结构和算法 Java数据结构和算法 Java数据结构和算法

    Java类文件加密专家

    Java 类文件加密专家通过分析Class文件的结构,使用1024位加密算法将Class文件数据加密,任何Java反编译工具均不可能对加密后的文件进行破解。 系统特点 1.采用纯C语言开发的内核算法,运行速度极快。 2.彻底...

    JAVA_API1.6文档(中文)

    java.util.jar 提供读写 JAR (Java ARchive) 文件格式的类,该格式基于具有可选清单文件的标准 ZIP 文件格式。 java.util.logging 提供 JavaTM 2 平台核心日志工具的类和接口。 java.util.prefs 此包允许应用程序...

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

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

    java Web项目的目录结构说明

    myEclipse 创建的 java Web项目的目录结构说明

    Java web项目代码结构说明

    关于Java web项目代码结构说明

    MySQL表自动生成Java实体类

    配置好数据库连接字符串和输出路径,自动把MySQL数据表生成相应的Java实体类。附上数据库。来源是参考别人的代码,有添加了自动获取表名的功能,不需要手动写表名,非常方便。

    java实现对文件的各种操作的工具类.md

    # java实现对文件的各种操作的工具类 ## 可以实现的操作有: 1. 删除单个文件 2. 删除文件夹及文件夹下的文件 3. 使用文件流对单个文件进行复制 4. 复制整个文件夹内容(包含子文件夹中的所有内容) 5. ...

    数据结构(java版本)

    建议看完Java程序设计实用教程之后,再看这本书,主要是结合里面的理论,然后代码进行实践一波

    java 读取ZIP和RAR压缩包的目录结构

    java ZIP和RAR 压缩包 目录结构。 1.ant.jar 解决java自带zip不能读取中文压缩包的问题; 2.需要安装WINRAR软件,以便解压rar文件,然后获取对应目录; 3.实现在线预览压缩包目录结构的功能;

    Java数据结构与算法

    Java数据结构与算法Java数据结构与算法Java数据结构与算法Java数据结构与算法Java数据结构与算法Java数据结构与算法Java数据结构与算法

    javacv-1.5.7-API文档-中文版.zip

    赠送jar包:javacv-1.5.7.jar; 赠送原API文档:javacv-1.5.7-javadoc.jar; 赠送源代码:javacv-1.5.7-sources.jar;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    Java软件技术文档合集

    Java 是一种简单的面象对象的分布式的解释的健壮的安全的结构中立的可移植的性能很优异的多线程的动态的语言。 面向对象可以说是 Java 最重要的特性。Java 语言的设计完全是面向对象的,它不支持类似 C 语言那样的...

Global site tag (gtag.js) - Google Analytics