java的class类文件结构

利用五一小假期,看了一下java的类class文件结构,在此记录一下学习笔记。java

 

字节码并发

程序的存储格式。语言无关。学习

跨平台。翻译

class文件 — 概述对象

  • 包含了Java虚拟机指令集符号表,以及若干其余辅助信息。
  • class文件是一组以8位字节为基础单位的二进制流。大端方式存储。

class文件 — 结构继承

  1. 魔数、class文件的版本
    魔数:肯定这个文件能被虚拟机接受。4个字节:0xCAFEBABE
    版本:紧接着魔数后面。4个字节。
              第五、6个字节标识次版本号。
              第七、8个字节标识主版本号。
     
  2. 常量池
    紧接着版本号,资源仓库。
    主要存放两大类常量:字面量(文本字符串、声明为final的常量值等)、符号引用。
    java代码javac编译,在虚拟机加载class文件时动态连接。
    当虚拟机运行时,须要从常量池获取对应的符号引用,再在类建立或运行时解析、翻译到具体的内存地址中。
    Java中若是定义超过64KB英文字符的变量或方法名,将没法解析。
     
  3. 访问标志
    用于识别一些类或接口层次的访问信息。
    好比public、final等。
     
  4. 类索引、父类索引、接口索引集合
    用这三项数据来肯定这个类的继承关系。
    类索引:肯定这个类的全限定名。
    父类索引:用于肯定这个类的父类的全限定名。
    接口索引集合:用来描述这个类实现了哪些接口。
     
  5. 字段表集合
    用于描述接口或者类中声明的变量。
    包括的信息:字段的做用域、实例变量仍是类变量、可变性、并发可见性、能否被序列化、字段数据类型、字段名称。
     
  6. 方法表集合
    对方法的描述,相似字段表集合。
    方法里的java代码,存储在“Code”属性里。
    Java中,要重载一个方法,要求必须拥有一个与原方法不一样的特征签名。
     
  7. 属性表集合
    在class文件、字段表、方法表中,均可以携带本身的属性表集合,以用于描述某些场景专有的信息。

字节码指令简介索引

由一个字节长度的、表明着某种特定操做含义的数字、以及跟随其后的0至多个表明此操做所需参数构成。接口

  1. 字节码
    大部分的指令都没有支持byte、char、short,甚至彻底没有boolean类型。编译器会在编译期或运行期将byte、short类型的数据带符号扩展为相应的int类型数据,将boolean和char类型数据零位扩展为相应的int类型数据。

    大多数对于boolean、byte、short、char类型数据的操做,实际上都是使用相应的int类型做为运算类型。
     
  2. 加载和存储指令
    用于将数据在栈帧中的局部变量表和操做数栈之间来回传输。
     
  3. 运算指令
    用于对两个操做数栈上的值进行某种特定的运算,并把结果从新存入到操做栈顶。
    分为两种:对整型数据进行运算的指令、对浮点型数据运算的指令。
    舍入操做:向最接近数舍入模式。
     
  4. 类型转换指令
    将两种不一样的数值类型相互转换。
    宽化类型转换、窄化类型转换。
     
  5. 对象建立与访问指令
    new、newarray、getfield、putfield、baload、bastore、arraylength、instanceof等等。
     
  6. 操做数栈管理指令
    pop、dup、swap等等。
     
  7. 控制转移指令
    在有条件或无条件地修改PC寄存器的值。
     
  8. 方法调用和返回指令
    invokevirtual、invokeinterface、invokespecial、invokestatic、invokedynamic等
     
  9. 异常处理指令
    显示抛出异常:athrow;
    虚拟机检测到异常字段抛出:如ArithmeticException。
     
  10. 同步指令
    使用管程来实现。

 

初步看完,有的地方仍是有点难理解,并且感受过段时间就会忘记。惟有往后不断思考、复习来加深印象。内存

相关文章
相关标签/搜索