当前位置: 首页 > news >正文

ASM Opcodes 完整属性详解

ASM Opcodes 完整属性详解

Opcodes 类概述

Opcodes 类是 ASM 库中的常量定义类,包含了所有 Java 字节码操作码、访问标志、版本号等常量。这些常量用于在字节码级别操作和生成 Java 类。

1. Java 版本常量

常量

描述

对应 Java 版本

V1_1

45

Java 1.1 版本号

Java 1.1

V1_2

46

Java 1.2 版本号

Java 1.2

V1_3

47

Java 1.3 版本号

Java 1.3

V1_4

48

Java 1.4 版本号

Java 1.4

V1_5

49

Java 5 版本号

Java 5

V1_6

50

Java 6 版本号

Java 6

V1_7

51

Java 7 版本号

Java 7

V1_8

52

Java 8 版本号

Java 8

V9

53

Java 9 版本号

Java 9

V10

54

Java 10 版本号

Java 10

V11

55

Java 11 版本号

Java 11

V12

56

Java 12 版本号

Java 12

V13

57

Java 13 版本号

Java 13

V14

58

Java 14 版本号

Java 14

V15

59

Java 15 版本号

Java 15

V16

60

Java 16 版本号

Java 16

V17

61

Java 17 版本号

Java 17

V18

62

Java 18 版本号

Java 18

V19

63

Java 19 版本号

Java 19

V20

64

Java 20 版本号

Java 20

V21

65

Java 21 版本号

Java 21

使用示例:

// 定义不同版本的类
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES);// Java 8 类
cw.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, "com/example/Java8Class", null, "java/lang/Object", null);// Java 11 类  
cw.visit(Opcodes.V11, Opcodes.ACC_PUBLIC, "com/example/Java11Class", null, "java/lang/Object", null);

2. 访问修饰符常量

类访问修饰符

常量

描述

ACC_PUBLIC

0x0001

public 访问权限

ACC_FINAL

0x0010

final 类,不可被继承

ACC_SUPER

0x0020

使用新的 invokespecial 语义

ACC_INTERFACE

0x0200

接口类型

ACC_ABSTRACT

0x0400

抽象类

ACC_SYNTHETIC

0x1000

合成类,由编译器生成

ACC_ANNOTATION

0x2000

注解类型

ACC_ENUM

0x4000

枚举类型

ACC_MODULE

0x8000

模块(Java 9+)

使用示例:

// public final 类
int classAccess = Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL;
cw.visit(Opcodes.V1_8, classAccess, "com/example/FinalClass", null, "java/lang/Object", null);// 接口定义
int interfaceAccess = Opcodes.ACC_PUBLIC | Opcodes.ACC_INTERFACE | Opcodes.ACC_ABSTRACT;
cw.visit(Opcodes.V1_8, interfaceAccess, "com/example/MyInterface", null, "java/lang/Object", null);// 枚举定义
int enumAccess = Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL | Opcodes.ACC_ENUM;
cw.visit(Opcodes.V1_8, enumAccess, "com/example/MyEnum", null, "java/lang/Enum", null);

字段访问修饰符

常量

描述

ACC_PUBLIC

0x0001

public 字段

ACC_PRIVATE

0x0002

private 字段

ACC_PROTECTED

0x0004

protected 字段

ACC_STATIC

0x0008

static 字段

ACC_FINAL

0x0010

final 字段

ACC_VOLATILE

0x0040

volatile 字段

ACC_TRANSIENT

0x0080

transient 字段

ACC_SYNTHETIC

0x1000

合成字段

ACC_ENUM

0x4000

枚举字段

使用示例:

// public static final 字段
int fieldAccess = Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC | Opcodes.ACC_FINAL;
cw.visitField(fieldAccess, "CONSTANT", "I", null, 100);// private volatile 字段
int volatileField = Opcodes.ACC_PRIVATE | Opcodes.ACC_VOLATILE;
cw.visitField(volatileField, "counter", "I", null, null);

方法访问修饰符

常量

描述

ACC_PUBLIC

0x0001

public 方法

ACC_PRIVATE

0x0002

private 方法

ACC_PROTECTED

0x0004

protected 方法

ACC_STATIC

0x0008

static 方法

ACC_FINAL

0x0010

final 方法

ACC_SYNCHRONIZED

0x0020

synchronized 方法

ACC_BRIDGE

0x0040

桥接方法(编译器生成)

ACC_VARARGS

0x0080

可变参数方法

ACC_NATIVE

0x0100

native 方法

ACC_ABSTRACT

0x0400

抽象方法

ACC_STRICT

0x0800

strictfp 方法

ACC_SYNTHETIC

0x1000

合成方法

使用示例:

// public static 方法
int methodAccess = Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC;
MethodVisitor mv = cw.visitMethod(methodAccess, "staticMethod", "()V", null, null);// synchronized 方法  
int syncMethod = Opcodes.ACC_PUBLIC | Opcodes.ACC_SYNCHRONIZED;
MethodVisitor mv2 = cw.visitMethod(syncMethod, "syncMethod", "()V", null, null);// native 方法
int nativeMethod = Opcodes.ACC_PUBLIC | Opcodes.ACC_NATIVE;
MethodVisitor mv3 = cw.visitMethod(nativeMethod, "nativeMethod", "()V", null, null);

3. 栈操作指令

常量

描述

示例

NOP

0

空操作

nop

ACONST_NULL

1

将 null 压入栈

aconst_null

ICONST_M1

2

将 int -1 压入栈

iconst_m1

ICONST_0

3

将 int 0 压入栈

iconst_0

ICONST_1

4

将 int 1 压入栈

iconst_1

ICONST_2

5

将 int 2 压入栈

iconst_2

ICONST_3

6

将 int 3 压入栈

iconst_3

ICONST_4

7

将 int 4 压入栈

iconst_4

ICONST_5

8

将 int 5 压入栈

iconst_5

LCONST_0

9

将 long 0 压入栈

lconst_0

LCONST_1

10

将 long 1 压入栈

lconst_1

FCONST_0

11

将 float 0 压入栈

fconst_0

FCONST_1

12

将 float 1 压入栈

fconst_1

FCONST_2

13

将 float 2 压入栈

fconst_2

DCONST_0

14

将 double 0 压入栈

dconst_0

DCONST_1

15

将 double 1 压入栈

dconst_1

使用示例:

// 将常量压入栈
mv.visitInsn(Opcodes.ICONST_0);  // 压入 0
mv.visitInsn(Opcodes.ICONST_1);  // 压入 1
mv.visitInsn(Opcodes.ACONST_NULL); // 压入 null// 创建数组时常用
mv.visitInsn(Opcodes.ICONST_3);  // 压入 3,用于创建长度为3的数组
mv.visitTypeInsn(Opcodes.ANEWARRAY, "java/lang/String");

4. 局部变量加载指令

常量

描述

示例

ILOAD

21

加载 int 局部变量

iload

LLOAD

22

加载 long 局部变量

lload

FLOAD

23

加载 float 局部变量

fload

DLOAD

24

加载 double 局部变量

dload

ALOAD

25

加载引用类型局部变量

aload

ILOAD_0

26

加载第0个 int 局部变量

iload_0

ILOAD_1

27

加载第1个 int 局部变量

iload_1

ILOAD_2

28

加载第2个 int 局部变量

iload_2

ILOAD_3

29

加载第3个 int 局部变量

iload_3

ALOAD_0

42

加载第0个引用局部变量(通常是this)

aload_0

使用示例:

// 加载局部变量
mv.visitVarInsn(Opcodes.ALOAD, 0);  // 加载 this
mv.visitVarInsn(Opcodes.ILOAD, 1);  // 加载第一个int参数
mv.visitVarInsn(Opcodes.ALOAD, 2);  // 加载第二个引用参数// 优化指令(索引0-3)
mv.visitVarInsn(Opcodes.ALOAD_0);   // 等同于 aload 0
mv.visitVarInsn(Opcodes.ILOAD_1);   // 等同于 iload 1

5. 局部变量存储指令

常量

描述

示例

ISTORE

54

存储 int 到局部变量

istore

LSTORE

55

存储 long 到局部变量

lstore

FSTORE

56

存储 float 到局部变量

fstore

DSTORE

57

存储 double 到局部变量

dstore

ASTORE

58

存储引用到局部变量

astore

ISTORE_0

59

存储到第0个 int 局部变量

istore_0

ISTORE_1

60

存储到第1个 int 局部变量

istore_1

使用示例:

// 计算并存储结果
mv.visitVarInsn(Opcodes.ILOAD, 1);
mv.visitVarInsn(Opcodes.ILOAD, 2);
mv.visitInsn(Opcodes.IADD);        // 相加
mv.visitVarInsn(Opcodes.ISTORE, 3); // 存储到局部变量3// 优化指令
mv.visitVarInsn(Opcodes.ISTORE_1);  // 存储到局部变量1

6. 数组操作指令

常量

描述

示例

IALOAD

46

加载 int 数组元素

iaload

BALOAD

51

加载 byte 数组元素

baload

AALOAD

50

加载引用数组元素

aaload

IASTORE

79

存储到 int 数组

iastore

BASTORE

84

存储到 byte 数组

bastore

AASTORE

83

存储到引用数组

aastore

ARRAYLENGTH

190

获取数组长度

arraylength

使用示例:

// 创建并操作数组
mv.visitInsn(Opcodes.ICONST_3);
mv.visitTypeInsn(Opcodes.ANEWARRAY, "java/lang/String");// 存储到数组
mv.visitInsn(Opcodes.DUP);          // 复制数组引用
mv.visitInsn(Opcodes.ICONST_0);     // 索引0
mv.visitLdcInsn("Hello");           // 值
mv.visitInsn(Opcodes.AASTORE);      // 存储// 加载数组元素
mv.visitVarInsn(Opcodes.ALOAD, 1);  // 加载数组引用
mv.visitInsn(Opcodes.ICONST_0);     // 索引0
mv.visitInsn(Opcodes.AALOAD);       // 加载元素

7. 算术运算指令

常量

描述

示例

IADD

96

int 加法

iadd

ISUB

100

int 减法

isub

IMUL

104

int 乘法

imul

IDIV

108

int 除法

idiv

IREM

112

int 取模

irem

INEG

116

int 取负

ineg

LADD

97

long 加法

ladd

FADD

98

float 加法

fadd

DADD

99

double 加法

dadd

使用示例:

// 算术运算
mv.visitVarInsn(Opcodes.ILOAD, 1);
mv.visitVarInsn(Opcodes.ILOAD, 2);
mv.visitInsn(Opcodes.IADD);  // a + bmv.visitVarInsn(Opcodes.ILOAD, 3);
mv.visitInsn(Opcodes.ISUB);  // (a + b) - cmv.visitVarInsn(Opcodes.ILOAD, 4);
mv.visitInsn(Opcodes.IMUL);  // ((a + b) - c) * d

8. 类型转换指令

常量

描述

示例

I2L

133

int 转 long

i2l

I2F

134

int 转 float

i2f

I2D

135

int 转 double

i2d

L2I

136

long 转 int

l2i

F2I

139

float 转 int

f2i

D2I

142

double 转 int

d2i

I2B

145

int 转 byte

i2b

I2C

146

int 转 char

i2c

I2S

147

int 转 short

i2s

使用示例:

// 类型转换
mv.visitVarInsn(Opcodes.ILOAD, 1);  // 加载 int
mv.visitInsn(Opcodes.I2L);         // 转换为 long
mv.visitVarInsn(Opcodes.ILOAD, 2);  // 加载另一个 int
mv.visitInsn(Opcodes.I2L);         // 转换为 long
mv.visitInsn(Opcodes.LADD);        // long 加法// 截断转换
mv.visitVarInsn(Opcodes.DLOAD, 1);  // 加载 double
mv.visitInsn(Opcodes.D2I);         // 转换为 int(截断)

9. 对象操作指令

常量

描述

示例

NEW

187

创建新对象

new

NEWARRAY

188

创建基本类型数组

newarray

ANEWARRAY

189

创建引用类型数组

anewarray

MULTIANEWARRAY

197

创建多维数组

multianewarray

CHECKCAST

192

类型检查转换

checkcast

INSTANCEOF

193

实例类型检查

instanceof

GETFIELD

180

获取实例字段值

getfield

PUTFIELD

181

设置实例字段值

putfield

GETSTATIC

178

获取静态字段值

getstatic

PUTSTATIC

179

设置静态字段值

putstatic

使用示例:

// 创建对象
mv.visitTypeInsn(Opcodes.NEW, "java/util/Date");
mv.visitInsn(Opcodes.DUP);
mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/util/Date", "<init>", "()V", false);// 字段操作
mv.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
mv.visitVarInsn(Opcodes.ALOAD, 0);
mv.visitFieldInsn(Opcodes.GETFIELD, "com/example/MyClass", "name", "Ljava/lang/String;");// 类型检查
mv.visitTypeInsn(Opcodes.CHECKCAST, "java/lang/String");
mv.visitTypeInsn(Opcodes.INSTANCEOF, "java/util/List");

10. 方法调用指令

常量

描述

示例

INVOKEVIRTUAL

182

调用实例方法(虚方法)

invokevirtual

INVOKESPECIAL

183

调用特殊方法(构造、私有、父类)

invokespecial

INVOKESTATIC

184

调用静态方法

invokestatic

INVOKEINTERFACE

185

调用接口方法

invokeinterface

INVOKEDYNAMIC

186

调用动态方法(Java 7+)

invokedynamic

使用示例:

// 调用实例方法
mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);// 调用构造函数
mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);// 调用静态方法
mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Math", "max", "(II)I", false);// 调用接口方法
mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/util/List", "size", "()I", true);

11. 控制转移指令

常量

描述

示例

IFEQ

153

如果等于0则跳转

ifeq

IFNE

154

如果不等于0则跳转

ifne

IFLT

155

如果小于0则跳转

iflt

IFGE

156

如果大于等于0则跳转

ifge

IFGT

157

如果大于0则跳转

ifgt

IFLE

158

如果小于等于0则跳转

ifle

IF_ICMPEQ

159

如果两个int相等则跳转

if_icmpeq

IF_ICMPNE

160

如果两个int不相等则跳转

if_icmpne

GOTO

167

无条件跳转

goto

JSR

168

跳转到子程序

jsr

RET

169

从子程序返回

ret

TABLESWITCH

170

switch 表跳转

tableswitch

LOOKUPSWITCH

171

switch 查找跳转

lookupswitch

使用示例:

Label start = new Label();
Label end = new Label();
Label ifTrue = new Label();mv.visitLabel(start);
mv.visitVarInsn(Opcodes.ILOAD, 1);
mv.visitJumpInsn(Opcodes.IFNE, ifTrue);  // 如果不等于0跳转// false 分支代码
mv.visitInsn(Opcodes.ICONST_0);
mv.visitJumpInsn(Opcodes.GOTO, end);// true 分支代码
mv.visitLabel(ifTrue);
mv.visitInsn(Opcodes.ICONST_1);// 结束标签
mv.visitLabel(end);

12. 返回指令

常量

描述

示例

IRETURN

172

返回 int

ireturn

LRETURN

173

返回 long

lreturn

FRETURN

174

返回 float

freturn

DRETURN

175

返回 double

dreturn

ARETURN

176

返回引用

areturn

RETURN

177

返回 void

return

使用示例:

// 根据不同返回类型使用不同指令
Type returnType = Type.getReturnType(methodDesc);
switch (returnType.getSort()) {case Type.VOID:mv.visitInsn(Opcodes.RETURN);break;case Type.INT:mv.visitInsn(Opcodes.IRETURN);break;case Type.OBJECT:mv.visitInsn(Opcodes.ARETURN);break;// ... 其他类型
}

13. ASM 特定常量

常量

描述

ASM4

4 << 16

ASM 4 API 版本

ASM5

5 << 16

ASM 5 API 版本

ASM6

6 << 16

ASM 6 API 版本

ASM7

7 << 16

ASM 7 API 版本

ASM8

8 << 16

ASM 8 API 版本

ASM9

9 << 16

ASM 9 API 版本

使用示例:

// 使用特定版本的 ASM API
ClassVisitor cv = new ClassVisitor(Opcodes.ASM7) {// 类访问逻辑
};MethodVisitor mv = new MethodVisitor(Opcodes.ASM7) {// 方法访问逻辑
};

14. 其他重要常量

常量

描述

H_GETFIELD

1

句柄类型:GETFIELD

H_GETSTATIC

2

句柄类型:GETSTATIC

H_PUTFIELD

3

句柄类型:PUTFIELD

H_PUTSTATIC

4

句柄类型:PUTSTATIC

H_INVOKEVIRTUAL

5

句柄类型:INVOKEVIRTUAL

H_INVOKESTATIC

6

句柄

http://www.dtcms.com/a/590220.html

相关文章:

  • Windows Server 2022 + IIS + .NET 8 + MySQL 部署手册
  • hemi网站怎么做热图怎样做网站的seo
  • 跟着小码学算法Day21:验证二叉搜索树
  • wordpress外汇主题wordpress 网站优化
  • 邮箱合法性判断【Java】
  • 苏州做网站费用网页设计与应用
  • 上传网站流程怎么做淘客手机网站
  • 深圳网站关键字优化网页设计怎么把图片上移
  • 微信授权登录第三方网站开发设计师建站网站
  • C++数据结构实战:二叉搜索树的核心操作与应用场景
  • 可以下载的建站网站有必要买优化大师会员吗
  • 微网站免费模板建站公司主要做那些业务
  • KingbaseES权限隔离深度解析:从MySQL的遗憾到安全增强的革新之路
  • 格力网站的建设情况邢台做网站哪家便宜
  • pythob编程能力测试备考
  • 泉州快速优化排名广州seo排名优化服务
  • equals和==的区别
  • 搭建租号网的网站如何在建设厅网站搜索企业
  • 域名解析记录值填什么杭州小周seo
  • 医院做网站是最简单的前端吗vs2019怎么创建网站
  • 手表网站排名大全吉林省建设安全信息网官网
  • 嘉定企业网站开发做网站 计算机有交嘛
  • 商城网站设计一站式服务如何制作网址内容
  • voice_control_smart_car(语音控制智能小车)
  • 如何做1个手机网站宜宾网站建设价格
  • ‘pyinstaller‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。
  • 2025年11月9日互联网技术热点TOP3及影响分析(乌镇核心消息)
  • 可以做问答的网站开题报告旅游网站建设
  • 公司的建设网站公司wordpress 首页显示文章数量
  • 郑州网站建设炉石wordpress 关闭feed