深入理解JAVA虚拟机系列之循环字节码案例
一、简介
- 本文主要介绍StackMapTable属性和循环的字节码生成案例及分析方法;
二、循环案例
2.1 代码脚本

2.2 编译分析
- 使用javac -g:vars ClassCode.java 将java源代码编译成ClassCode.class字节码文件;
- 使用javap -c -verbose ClassCode.class 命令反编译出来结果;
![]()
![]()
三、StackMapTable
3.1 概念
- StackMapTable, 栈帧映射, class文件字节码的一个属性表的东西,用于class文件类型校验;
3.2 结构

3.3 frame_type类型详解
| frame_type类型 | 偏移量 | 备注 |
|---|---|---|
| SAME | 0-63 | 与上一个比较位置的局部变量表相同,且操作数栈为空,这个值也是隐含的 offset_delta |
| SAME_LOCALS_1_STACK_ITEM | 64-127 | 当前帧与上一帧有相同的局部变量,操作数栈中的变量数目为 1,隐式 offset_delta 为 frame_type - 64 |
| SAME_LOCALS_1_STACK_ITEM_EXTENDED | 247 | |
| CHOP | 248-250 | 当前帧比上一帧少了k个局部变量,其中 k = 251 - frame_type |
| SAME_FRAME_EXTENDED | 251 | 局部变量信息和上一个帧相同,且操作数栈为空 |
| APPEND | 252-254 | 当前帧比上一帧多了k个局部变量,且操作数栈为空,其中 k = frame_type - 251 |
| FULL_FRAME | 255 | 局部变量表和操作数栈做完整记录 |



浙公网安备 33010602011771号