JVM:类文件结构

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fanxing1964/article/details/83514371

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,用于运行时动态解析出调用点限定符所引用的方法

异常处理指令

同步指令

猜你喜欢

转载自blog.csdn.net/fanxing1964/article/details/83514371