asm生成switch语句方法
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文件如下:
猜你喜欢
blog
asm生成for循环语句方法
java基础
1815
asm生成for循环语句方法1.jar包2.原java文件packageclub.jiajia.test3;publicclassExamp4{ publicintmethod(inta
java基础
2624
asm动态生成类和getandset方法1.自定义类加载器packageclub.jiajia.test;publicclassMyClassLoaderextendsClassLoader
blog
asm实例对象方法的调用
java基础
2407
asm实例对象方法的调用1.需要的jar包2.我们需要通过asm生成的目标类如下:packageclub.jiajia.test3;publicclassExamp5
数据库基础
1810
两种用法:简单case函数casesexwhen'1'then'男'when'2'then'女’else'其他'endcase搜索函数casewhensex='1'then'男'whensex='2
blog
mysql批量更新生成不同的uuid
数据库
1483
mysql批量更新生成不同的uuidsql语句:UPDATEusersetuuid=UUID();去掉中间的-UPDATEusersetuuid=REPLACE(uuid,"-","");注意这两个
weblog
1552
java使用原生jdbc连接数据库获取数据或执行sql语句(mysql) publicvoidtest2(){ try{ //加载MySql的驱动类 Class.forName
ofc
冠词-英语语法
weblog
432
冠词-英语语法
数据结构与算法
1114
prim(普里姆)算法求出。对于任何一个数据结构或算法,理解和实现只是一个方面,更重要的是要明白它的应用范围或应用场景,最小生成树算法的应用非常广泛,例如:假设要在n个城市之间建立通信联络网,则连接n个
最近发表
归档
2018年11月
12
2018年12月
33
2019年01月
28
2019年02月
28
2019年03月
32
2019年04月
27
2019年05月
33
2019年06月
6
2019年07月
12
2019年08月
12
2019年09月
21
2019年10月
8
2019年11月
15
2019年12月
25
2020年01月
9
2020年02月
5
2020年03月
16
2020年04月
4
2020年06月
1
2020年07月
7
2020年08月
13
2020年09月
9
2020年10月
5
2020年12月
3
2021年01月
1
2021年02月
5
2021年03月
7
2021年04月
4
2021年05月
4
2021年06月
1
2021年07月
7
2021年08月
2
2021年09月
8
2021年10月
9
2021年11月
16
2021年12月
14
2022年01月
7
2022年05月
1
2022年08月
3
2022年09月
2
2022年10月
2
2022年12月
5
2023年01月
3
2023年02月
1
2023年03月
4
标签
算法基础
linux
前端
c++
数据结构
框架
数据库
计算机基础
储备知识
java基础
ASM
其他
深入理解java虚拟机
nginx
git
消息中间件
搜索
maven
redis
docker
dubbo
vue
导入导出
软件使用
idea插件
协议
无聊的知识
jenkins
springboot
mqtt协议
keepalived
minio
mysql
ensp
网络基础
xxl-job
rabbitmq
haproxy
srs
音视频
webrtc
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。