Class文件版本 + 常量池 + 访问标志 + 类索引父类索引接口索引集合 + 字段表 + 方法表 + 属性表
常量池
可以理解为Class的资源仓库,占用空间最大的数据项目之一,是一个表类型数据项目,他与很多的结构都有关联,算是很复杂的一个部分。主要有字面量和符号引用组成。字面量就是文本字符串和final常量值,符号引用包含三类:
- 类和接口的全限定名
- 字段的名称和描述符
- 方法的名称和描述符
访问标志
用于标识这个类或接口的访问信息,例如这个Class是接口还是类,是否定义为public类型,是否定义为abstract类型,是否别声明为final。
类索引,父类索引,接口索引集合
确定类的继承关系。其中类索引用于确定这个类的全限定名。由于类只可以单继承,接口可以多继承,所以父类索引只有一个,接口索引是集合;由于所有的类都是继承自Object,所以除了Object外父类索引不能为0。(全限定名这些名称都存在常量池里)
字段表集合
接口或类中声明的变量,可以使类级变量可以使实例变量,但不包括方法内的局部变量。表的信息可以有:字段的作用于(private,public,protected),实例变量还是类变量(有无static),可变性(final),并发可见性(volatile,是否强制从主内存读写),可否序列化(transient),字段数据类型(基本,对象,数组),字段名称。以上各个修饰符都是布尔值,而字段叫什么,是什么类型无法固定的,只可以引用常量池中的常量来表述。
例如:private volatile Integer a = 23;那么pruvate,volatile这些属性都会存在字段表里,而 'a' 这个字段名需要地址从常量池里取
方法表集合
方法表结构如同字段表机构,一次包括访问标志,名称索引,描述符索引,属性表集合
属性表集合
字节码指令
加载和存储指令:iload,istore,bipush
运算指令:iadd,isub,imul
类型转换指令
对象创建和访问指令:
- new,创建类的实例
- newarray,创建数组
- getfield,访问实例字段
- putfield,更改实例字段
- getstatic,访问static字段,或称为类变量
- putstatic,更改类变量
擦作数栈指令:pop,dup
控制转移指令:ifeq,iflt,goto
方法调用和返回指令:
- invokevirtual,调用对象实例方法
- invokeinterface,调用接口方法
- invokespecial,调用特殊方法,例如实例初始化方法
- invokestatic,调用类方法
- invokedynamic,用于运行时动态解析出调用点限定符所引用的方法
异常处理指令
同步指令