深入理解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 局部变量表和操作数栈做完整记录

四、总结

posted @ 2021-01-19 11:19  请叫我猿叔叔  阅读(250)  评论(0)    收藏  举报