1.jar包:

2.原java文件:
package club.jiajia.test3;
public class Examp3 {
public int method(int a){
switch (a) {
case 123:
a=1230;
break;
case 128:
a=1280;
break;
case 12:
a=120;
break;
}
return a;
}
}
3.javap -c命令反编译此java的字节码文件
Compiled from "Examp3.java"
public class club.jiajia.test3.Examp3 {
public club.jiajia.test3.Examp3();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public int method(int);
Code:
0: iload_1
1: lookupswitch { // 3
12: 50
123: 36
128: 43
default: 53
}
36: sipush 1230
39: istore_1
40: goto 53
43: sipush 1280
46: istore_1
47: goto 53
50: bipush 120
52: istore_1
53: iload_1
54: ireturn
}
我们只看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 TestAsm3 implements Opcodes{
public static void main(String[] args) throws InstantiationException, IllegalAccessException{
ClassWriter cw=new ClassWriter(0);
String className="Example3";
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.visitVarInsn(ILOAD, 1);
Label def=new Label();
int val[]=new int[]{12,123,128};
Label labs[]=new Label[3];
labs[0]=new Label();
labs[1]=new Label();
labs[2]=new Label();
mv.visitLookupSwitchInsn(def,val,labs);
mv.visitLabel(labs[0]);
mv.visitFrame(F_SAME, 0, null, 0, null);
mv.visitIntInsn(SIPUSH,1230);
mv.visitVarInsn(ISTORE,1);
mv.visitJumpInsn(GOTO, end);
mv.visitLabel(labs[1]);
mv.visitFrame(F_SAME, 0, null, 0, null);
mv.visitIntInsn(SIPUSH,1280);
mv.visitVarInsn(ISTORE,1);
mv.visitJumpInsn(GOTO, end);
mv.visitLabel(labs[2]);
mv.visitFrame(F_SAME, 0, null, 0, null);
mv.visitIntInsn(SIPUSH,120);
mv.visitVarInsn(ISTORE,1);
mv.visitJumpInsn(GOTO, end);
mv.visitLabel(def);
mv.visitFrame(F_SAME, 0, null, 0, null);
mv.visitLabel(end);
mv.visitFrame(F_SAME, 0, null, 0, null);
mv.visitVarInsn(ILOAD, 1);
mv.visitInsn(IRETURN);
mv.visitMaxs(2, 2);
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/Example3.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(12003));
}
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文件如下:
