深入讲解java中method在class中的组织形式


说道class文件我们先讲讲class文件中包含哪些东西吧

魔数(4字节),副版本号(2字节),主版本号(2字节),常量池计数器(2字节)常量池,类访问标志,类索引,父类索引,接口计数器(2字节),接口信息数据区,字段计数器(2字节),字段信息数据区,方法计数器(2字节),方法信息数据区



再讲method在class中组织形式前我们先了解几个名词吧

方法表:将一个方法的全部信息记录在一个方法表中

   方法表集合:有多个多个方法表的集合

方法计数器:记录有多少个方法

   方法信息数据区:存放记录方法表集合


现在开始讲解了:

我们讲讲方法表的结构吧:

方法表包含4个内容

A.访问标识符:(2字节)记录作用域,静态,同步,本地等等

B.名称索引:(2字节):存储常量池的某个常量项的地址---->方法的名字

C.描述索引:(2字节):存储常量池的某个常量项的地址---->(参数列表)+返回类型,如()V,表示没有参数,没有返回类型为void

D.属性表集合:包含2个内容

1.属性计数器

2.属性类型:包含2中类型

A.Code类型:  (大分:机器指令(code),异常跳转(exception_table),Java源代码行号和机器指令对应(LineNumberTable),局部变量描述LocalVariableTable)

a.属性名称索引:(2字节)(表示此类型是Code)

b.属性长度:(2字节):表示属性值有多少个字节如:N

c.属性值:(N个字节):

3. max_stack,操作数栈深度的最大值,占有 2 个字节,在方法执行的任意时刻,操作数栈都不应该超过这个值,虚拟机的运行的时候,会根据这个值来设置该方法对应的栈帧(Stack Frame)中的操作数栈的深度;
4. max_locals,最大局部变量数目,占有 2个字节,其内的值表示局部变量表所需要的存储空间大小;
5. code_length,机器指令长度,占有 4 个字节,表示跟在其后的多少个字节表示的是机器指令;
6. code,机器指令区域,该区域占有的字节数目由 code_length中的值决定。JVM最底层的要执行的机器指令就存储在这里;
7. exception_table_length,显式异常表长度,占有2个字节,如果在方法代码中出现了try{} catch()形式的结构,该值不会为空,紧跟其后会跟着若干个exception_table结构体,以表示异常捕获情况;
8. exception_table显式异常表,占有8 个字节,start_pc,end_pc,handler_pc中的值都表示的是PC计数器中的指令地址。exception_table表示的意思是:如果字节码从第start_pc行到第end_pc行之间出现了catch_type所描述的异常类型,那么将跳转到handler_pc行继续处理。
9. attribute_count,属性计数器,占有 2 个字节,表示Code属性表的其他属性的数目
10. attribute_info,表示Code属性表具有的属性表,它主要分为两个类型的属性表:“LineNumberTable”类型和“LocalVariableTable”类型。
LineNumberTable”类型的属性表记录着Java源码和机器指令之间的对应关系
LocalVariableTable”类型的属性表记录着局部变量描述

B.Exception类型:

a.属性名称索引(2字节)(表示此类型是Exception)

b.属性长度:(4个字节):值表示后面有多少个表示异常信息

c.异常数量:(2字节):表示异常的熟练

d.异常名索引:(2字节)表示异常的名字(一个或一个以上)指向常量池中的常量项

Exception中长度的计算=2+4+2+2*异常数量


我们可以看看常量池:

先javac 类名.java(我的是Test.java)

然后javap -v 类名(就可以看常量池了)


参考:http://blog.csdn.net/luanlouis/article/details/41113695

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值