woieha320r的博客

字节码

· JVM识别字节码而非Java,字节码是图灵完备的,任何语言都可以编译为字节码以运行于JVM上

· 一个class文件只有一个类或接口的信息,以8字节为基础单位,多个单位间用“大端表示法”(高位单位放在低地址处,就是反人类的那种)

· jvm执行字节码是基于栈的

class文件记录了啥

  • 用以区别其他文件格式的魔数

  • 运行所要求的jvm最高版本

  • 常量池(字面量、类/接口的全限定名、字段/方法的名称/描述符、方法的句柄/类型、动态调用点和动态常量)

    • 一个字段/方法名只有65535位存储空间

    • 所有符号引用都存在这里,需要的地方指向这里

  • 访问标志:public、final、super、interface、enum、abstract、是否用户代码、annotation、module

  • 类名指针、父类名指针、接口集合名指针

  • 字段表,只有本class的字段(访问权限、static、final、volatile、transient、是否编译器生成、enum、名称指针、描述符指针(通过字符串表达类 型/参数/返回值,如byte应指向常量池的“B”字符)、属性表指针(如果字段同时被final、static修饰且是基本类型/字符串,则将常量值写在属性表,和类 字段零值一同赋值,否则由类初始化方法负责初始化))

  • 方法表,只有本class的方法(访问权限、static、final、synchronized、是否编译器产生的桥接方法、是否不定参数、是否本地、abstract 、strictfp、是否编译器生成的、属性表指针(方法体的字节码指令集))

  • 属性表