我看Java虚拟机(3)---类文件结构

来源:互联网 发布:ncs刷机软件 编辑:程序博客网 时间:2024/04/27 13:31

存储两种数据:无符号数和表。
魔数:4字节,识别文件,后缀是会被改变的,所以识别class文件是靠这四个字节。
版本号:2字节次版本号+2字节主版本号
常量池:2字节常量池中存放数据的个数len+len个常量顺序放置;11种数据类型1-12表示,标号2缺省(具体我也不知道为什么)
这里写图片描述
访问标志:2字节
类索引,父类索引,接口索引集合:2字节+2字节+若干字节,都索引向常量池的数据
字段数量:2字节
字段表:2字节(访问标志)+2字节(名称)+2字节(描述符)+若干(不重要)。用于描述接口或类中声明的变量。包括类变量(static修饰)和实例变量,不包括方法内部声明的变量(局部变量)。
全限定名:类似“org/example/clazz/TestClass”。
简单名称:没有类型和参数修饰的方法或字段名称。int inc(int a ,int b)和int m分别为inc和m。
描述符:(参数)+返回值。int index(char[] cs , int i )描述符为”([CI)I”
方法数量:2字节
方法表集合:类比字段表。访问标志增加,比如synchronized,abstract等。
属性表集合:主要code,存储方法指令字节码+其他属性。示例:

public int inc(){    int x;    try{        x = 1;        return x;    }catch(Exception e){        x = 2;        return x;    }finally{        x = 3;    }}

正常和异常返回值各式什么?答案:1,2;
以正常执行为例,虚拟机会这样执行,在操作数栈中给x赋值1,将该值的一个副本放到局部变量表中,finally修改操作数栈的x,但并不会影响局部变量的x值,当要执行返回指令时,操作数栈读入局部变量的1到栈顶,返回1。异常情况类同。

为什么字段表和方法表前面都有2字节的表述数量的字段,而类前面没有?
答:因为一个class文件只有一个类,而字段和方法数量不确定。
后面章节将会根据图:

这里写图片描述

一步一步分析讲解,前面算静态的,后面就是动态讲解了。

0 0