Java ASM 学习方法及插件安装

来源:互联网 发布:韩版男装淘宝店有哪些 编辑:程序博客网 时间:2024/06/05 10:14

最近在做某种诡异的解释器时需要使用ASMified code生成bytecode。从头去学ASM真是太困难了,网上的教程又很少。。。说的又很隐晦。。。所以就把研究成果简单汇总一下放在这里。。。

写的很烂,主要给自己看的,还请见谅~


ASM干嘛用的以及基础知识请去自行百度。微笑


其实通过下载使用ASM的BytecodeOutline插件可以轻易学习ASMified code的使用方法,BytecodeOutline不仅能将你写的java代码转换成bytecode显示,还能自动生成ASMified code,简直超级好用,下载地址如下:

http://forge.ow2.org/project/showfiles.php?group_id=23&release_id=5506


安装方法:


将下载的jar包解压出来,放到Eclipse的plugins目录下。打开eclipse选择window->show view->other->java->bytecode 就OK了~


使用方法:

敲一段代码,然后在选项卡里找到Bytecode就可以了,也可以通过选项卡内右上角ASM的红色图标来选择显示ASMified code。

最后写几个简单的转换例子。。。方便理解学习。。


1.创建变量

java 代码

int i = 0;

ASMified code

mv.visitInsn(ICONST_0); //这里的0指将数字0压入到栈顶mv.visitVarInsn(ISTORE, 1); //这里的1指将刚刚压入到栈顶的值存到局部变量栈1号的位置,而1号其实存的就是i对应的值


2.创建while循环
java 代码

boolean a = true;while(a){     i = 2;}

ASMified code

//以下两句对应boolean a = true;mv.visitInsn(ICONST_1); //这里压入栈顶的还是数字1,boolean变量其实存的也是数字,1代表true,0代表falsemv.visitVarInsn(ISTORE, 2);//刚刚已经说过,boolean变量其实存的也是数字,所以这里将刚刚压入栈顶的1存到栈内2号的位置,也就是a对应的位置//以下几句对应while循环//创建两个用于跳转的labelLabel GUARD = new Label();Label BODY = new Label();mv.visitJumpInsn(GOTO, GUARD);//直接跳转到“GUARD”这个label处继续执行代码mv.visitLabel(BODY);//用于跳转的“BODY”label//上面的label用来表示着进入了while的block循环体,也就是java代码中的 i = 2mv.visitInsn(ICONST_2); //先把数字2压入栈顶mv.visitVarInsn(ISTORE, 1); //将栈顶的数字2存入到变量栈1号位置(也就是i所在的位置)mv.visitLabel(GUARD);//用于跳转的"GUARD"labelmv.visitVarInsn(ILOAD, 2);//取出刚刚存在2号位置的a并将值放入栈顶。mv.visitJumpInsn(IFNE, BODY);//对栈顶存的值进行判断,如果符合条件,跳回到label BODY的位置继续执行(也就是重复执行{}内的语句)。

3.if判断和for循环都比上面的while简单。。写完while懒得写了。。。相信明白了while也能轻易明白if和for。。。。

4.加法,乘法,除法等运算

简单把加法,乘法,除法写在这里,更多的可以用BytecodeOutline自己去看~

mv.visitVarInsn(ILOAD, x);mv.visitVarInsn(ILOAD, y);//取出存在x和y两个位置的变量值mv.visitInsn(IADD);//把两个值相加mv.visitInsn(ISUB);//把两个值相减mv.visitInsn(IMUL);//把两个值相乘mv.visitInsn(IDIV);//把两个值相除


0 0
原创粉丝点击