asm生成for循环语句方法
1.jar包

2.原java文件
package club.jiajia.test3;
public class Examp4 {
public int method(int a){
int r=0;
for(int i=0;i<a;i++){
r++;
}
return r;
}
}
3.javap -c命令反编译此java的字节码文件
Compiled from "Examp4.java"
public class club.jiajia.test3.Examp4 {
public club.jiajia.test3.Examp4();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public int method(int);
Code:
0: iconst_0 //-将int类型的0推送到栈顶
1: istore_2 //-将栈顶int型数值存入第三个本地变量 r
2: iconst_0 //-将int型0推送至栈顶
3: istore_3 //-将栈顶int型数值存入第四个本地变量 i
4: iload_3 //-将第四个int型本地变量推送至栈顶
5: iload_1 //-将第二个int型本地变量推送至栈顶
6: if_icmpge 18 //-比较栈顶两int型数值大小,当结果大于等于0时跳转
9: iinc 2, 1 //-将指定int型变量增加指定值
12: iinc 3, 1 //-将指定int型变量增加指定值
15: goto 4 //-无条件跳转
18: iload_2 //-将第四个int型本地变量推送至栈顶
19: ireturn //-返回一个int值
}
“//-”是我自己写的注释
在此只关注method方法
4.按照上面的字节码文件编写java代码如下:
package club.jiajia.test3;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.Label;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
public class TestAsm4 implements Opcodes{
public static void main(String[] args) throws InstantiationException, IllegalAccessException{
ClassWriter cw=new ClassWriter(0);
String className="Example4";
cw.visit(0x31,ACC_PUBLIC,className,null,"java/lang/Object",new String[]{"java/lang/Cloneable",ITest.class.getName().replace('.','/')});
String method="method";
MethodVisitor mv;
/***********************************************************/
Label end = new Label();
mv=cw.visitMethod(ACC_PUBLIC,method,"(I)I",null,null);
mv.visitCode();
mv.visitInsn(ICONST_0);
mv.visitVarInsn(ISTORE,2);
mv.visitInsn(ICONST_0);
mv.visitVarInsn(ISTORE,3);
Label f=new Label();
mv.visitLabel(f);
mv.visitFrame(F_SAME, 0, null, 0, null);
mv.visitVarInsn(ILOAD,3);
mv.visitVarInsn(ILOAD,1);
mv.visitJumpInsn(IF_ICMPGE, end);
mv.visitIincInsn(2,1);
mv.visitIincInsn(3,1);
mv.visitJumpInsn(GOTO, f);
mv.visitLabel(end);
mv.visitFrame(F_SAME, 0, null, 0, null);
mv.visitVarInsn(ILOAD,2);
mv.visitInsn(IRETURN);
mv.visitMaxs(2, 4);
mv.visitEnd();
/***********************************************************/
//下面产生构造方法
mv=cw.visitMethod(ACC_PUBLIC,"<init>","()V",null,null);
mv.visitCode();
mv.visitVarInsn(ALOAD,0);
mv.visitMethodInsn(INVOKESPECIAL,"java/lang/Object","<init>","()V");
mv.visitInsn(RETURN);
mv.visitMaxs(1,1);
mv.visitEnd();
cw.visitEnd();
byte[] bs=cw.toByteArray();
File file = new File("E://jiajiajia/Example4.class");
try {
FileOutputStream fout = new FileOutputStream(file);
fout.write(bs);
fout.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
MyCLassLoader loader=new MyCLassLoader();
Class<?> c=loader.defineClass(bs);
ITest ins=(ITest)c.newInstance();
System.out.println(ins.method(123));
}
public interface ITest{
public int method(int a);
}
public static class MyCLassLoader extends ClassLoader{
public Class<?> defineClass(byte[] data){
return super.defineClass(null,data,0,data.length,null);
}
}
}
5.反编译生成的class文件如下:
