您的位置:首页 > 其它

Class 文件结构

2017-06-09 22:29 253 查看
[align=center]Class 文件结构
[/align]
一.语言无关性

    1.java虚拟机提供了java语言跨平台功能。可以让同一份Class文件运行在不同的平台上

    2.java虚拟机不仅提供了跨平台功能,甚至还还提供了跨语言的特性,只要各种语言的源码

       编译成 Class 文件,理论上都可以在 java 虚拟机上运行

二.Class 文件

    1.Class文件的结构(包含 类的属性,类的方法<访问标记,名称,描述符,属性>,

      类的字段<访问标记表项,名称,描述符,属性>,实现接口,父类,魔数<Class文件的特征>

      小版本号,大版本号,常量池<各种常量,整数,字符串,Class>,访问标记<public,static>

      当前类)

    2.Class 文件结构体的定义:

        a.文件以一个4字节Magic(魔数)开头,紧跟着两个大小版本号

        b.在版本号之后是常量池,常量池的个数为conctant_pool_count,常量池中的表项有conctant_pool_count-1项

        c.常量池之后是类的访问修饰符,代表自身类的引用,父类引用以及接口数量和实现的接口引用

        d.在接口之后,有着字段的数量和字段描述,方法数量以及方法的描述

        e.最后存放着类文件的属性信息

    3.魔数:Class 文件的标记,是一个4个字节的无符号整数,固定为 OxCAFEBABE

    4.Class 文件的版本:当前的 Class 文件,是由哪个版本的编译器编译产生的。高版本的虚拟机向下兼容

      低版本编译的Calss文件,低版本的虚拟机不向上兼容高版本编译的Class 文件。所以在开发环境跟实际生产

      环境中,应该注意JDK 的版本是否一致

    5.常量池:Class文件中内容最丰富的区域之一 ,存放着所有的常数,是整个Class 文件的基石。

      常量池底层数据类型:COUNTANT_Utf8 , CONSTANT_Intrger ,CONSTANT_Float , CONSTANT_Long ,

      CONSTANT_Double 分别表示 UTF8字符串,整数 , 浮点数,长整数和双精度浮点常量

      CONSTANT_NameAndType 表示一个名词和类型

      CONSTANT_Methoderf 表示一个类的方法

      CONSTANT_Fieldref 表示一个类字段的引用

      CONSTANT_InterfaceMethoderf 表示一个接口的方法

      CONSTANT_MethodHandle 表示函数的方法,类的字段或者构造函数

      CONSTANT_MethoderType 描述一个方法签名

      CONSTANT_InvokeDynamic 描述一个动态调用,动态调用的是java 虚拟机平台引入的专门为动态语言

                             提供函数动态调用绑定支持的功能

    6.Class的访问标记 :两个字节表示,用于表明该类的访问信息

    7.当前类,父类的接口 :指定该类的类别,父类类别以及实现的接口

    8.Class 文件字段 :类的字段信息

    9.Class文件的方法基本结构:类的方法信息

    10.方法的执行主体-Code 属性:

    11.记录行号 - LineNumberTble 属性

    12.保存局部变量和参数 - LacalVariableTable 属性

    13.加快字节码校验 - StackMaoTble 属性

    14.抛出异常 - Exception 属性

    15.SourceFile 属性 : 描述当前 Class 文件是由哪个源代码文件编译而来

    16.BootstraoMethods 属性:描述和保存引导方法

    17.InnerClasses 属性 : 描述外部类和内部类之间的联系

三.ASM : 一款操作 java 字节码的操作库,直接工作于底层。使用复杂,要求开发人员熟悉和掌握Class 文件的基本格式
    和java字节码对开发人的的要求相对较高,因此很少被直接使用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: