字节码
· 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、是否编译器生成的、属性表指针(方法体的字节码指令集))
-
属性表