java字节码文件解析学习笔记

https://blog.csdn.net/u011810352/article/details/80316870
参考文章写得非常好。本文也是自己基于参考文章学习时部分的自我理解和补充。

Class字节码中有两种数据类型:

字节数据直接量:这是基本的数据类型。共细分为u1,u2,u4,u8四种,分别代表连续的一个字节,2个字节,4个字节,8个字节组成的整体数据。

表(数组):表是由多个基本数据或其他表,按照既定顺序组成的大的数据集合。表是有结构的,它的结构体现在:组成包的成分所在的位置和顺序都是已经严格定义好的。

Code 的部分属性

max_stack表示这个方法运行的任何时刻所能达到的操作数栈的最大深度

max_locals表示方法执行期间创建的局部变量的数目,包含用来表示传入的参数的局部变量。max_locals的单位是Slot,Slot是虚拟机为局部变量分配内存所使用的最小单位。(局部变量会包含一个默认的this)

对于java类中的每一个实例方法(非static方法),其在编译后所生成的字节码中,方法参数的数量总是比源代码中方法参数的数量多一个(this),它位于方法的第一个参数位置处;这样我们就可以在java的实例方法中去访问当前对象的属性以及其他方法。

这个操作在编译期间完成的,即由javac编译器在编译的时候对this的访问转换为对一个普通实例方法参数的访问,接下来在运行期间由JVM在调用实例方法时,自动向实例方法传入该this参数。所以,在实例方法的局部变量表中,至少会有一个指向当前的局部变量。

code_length表示该方法所包含的字节码的字节数以及具体的指令码

exception_table_length即异常表长度;

异常表的结构如下:它包含4个字段,这些字段的含义为:如果当字节码在第start_pc行到第end_pc行之间(包含start_pc,不包含end_pc行)出现了类型为catch_type或者其子类的异常(catch_type为指向一个CONSTANT_Class_info型常量的索引),则转到第handler_pc行继续处理。当catch_type的值为0时,代表任意异常情况都需要转向到handler_pc处进行处理

exception_table { //(括号里是Terminal中使用javap指令的标识)
    u2 start_pc;//(from)
    u2 end_pc;//(to)
    u2 handler_pc;//(target)表示处理异常的代码的开始处
    u2 catch_type;//(type)表示会被处理的异常类型
}

8.5LocalVariableTable属性

LocalVariableTable属性结构图(和LineNumberTable属性结构图类似)

line_number_info(行号表),其长度为10个字节,前2个字节start(start_pc),紧接着2个字节表示长度,再接着2个字节是Name,再接着2个字节是Signature(descriptor),最后2个字节是slot(index) (括号里面的是jclasslib插件)

8.6StackMapTable属性

作用是为了提高JVM在类型检查的验证过程的效率,以下简称StackMapTable为栈图。 栈图结构位于Code属性中

StackMapTable属性结构

StackMapTable_attribute {
   u2  attribute_name_index;//对应的是常量池表的一个有效索引
   u4  attribute_length;//标识当前属性的长度(不计算attribute_name_index和attribute_length)
   u2  number_of_entries;//表示entries表的成员数量。entries表中的所有成员都是一个stack_map_frame结构
    stack_map_frame entries[number_of_entries];
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值