ASM框架学习(一)-基本概念

2019-05-16  本文已影响0人  奔跑地蜗牛

简介

ASM是java字节码操作框架,利用该框架可以达到动态修改java运行对象代码的目的,也可以实现动态代理等功能;

线程和栈帧

要了解ASM字节码操作,先要熟悉jvm线程与栈帧结构,jvm开辟一个线程,便会开辟属于这个线程虚拟机栈,本地方法栈,程序计数器,其主要作用如下:

基本类型

java字节码中的类型表达和java代码是不一样的,在java字节码中利用如下符号来表达基本类型:

java类型 type 含义
boolean Z 布尔
char C 字符
byte B 字节
short S 短整型
int I 整型
long J 长整型
float F 浮点数
reference L 类的引用
void V
double D 双精度浮点型
Object Ljava/lang/Object; 对象
int[] [I 整型数组
Object[][] [[Ljava/lang/Object; 对象数组

注: L+className;代表某类的引用(";"不能省略)

字节码实例:

Java代码 字节码表示 注释
double[][] [[D
Object run(int i,double d,Thread t) (IDLjava/lang/Thread)Ljava/lang/Object; (方法参数字节码类型)方法返回参数类型

字节码指令操作

字节码指令操作其实主要操作局部变量表和操作数栈,具体流程是:load局部变量到操作数栈,然后给cpu下达执行指令,然后将操作数栈栈顶元素弹出,从而实现一个操作;
字节码指令都有一定的格式:[type+]op["_"+value];

其中type根据基本类型可以为:i(int 整数),s(short 短整数),b(byte 字节),c(char字符),l(long长整数),d(double双精度浮点数),f(float 浮点数),a(reference 引用);
value指的是操作数,如果操作数为负数时需要添加'm"前缀,例如iconstant_m1表示将-1压栈;如果操作数值超过一定大小,则会将该操作数存放在常量池,用#indexbyte表示其位置;
op指的是操作码,通常用一个字节表示;

字节码指令操作主要分为九大指令:

加载和存储指令

加载指令主要是将局部变量和常量压入到操作数栈,具体指令有:

如下图所示:


加载存储指令.png

运算指令

运算指令有以下几种:

类型转换指令

类型转换指令有以下几种:

对象创建和访问指令

对象创建和访问指令通常需要两个操作数indexbyte1和indexbyte2

操作数栈管理指令

字等于两个字节,半个slot,16位

控制转移指令:

控制转移指令分为跳转指令和比较指令,无条件跳转指令,表跳转指令,异常跳转指令;
跳转指令:

比较指令:

无条件转移指令:

表跳转指令:

异常跳转指令:

方法调用和返回指令:

同步方法指令:

上一篇下一篇

猜你喜欢

热点阅读