ASM库

ASM是一个高性能的Java字节码分析和操作框架,用于动态生成和分析类。它提供了基于事件的核心API和基于对象的Tree API。通过继承ClassVisitor和实现相关方法,可以解析已有的类并进行输出。此外,ASM也可用于生成新的类和对类进行变形,例如在处理事件时进行过滤。示例展示了如何使用ASM打印类信息和生成类的字节码。
摘要由CSDN通过智能技术生成

1 简介

官网:https://asm.ow2.io/
javadoc :https://asm.ow2.io/javadoc/org/objectweb/asm/package-summary.html

(the ASM name does not mean anything: it is just a reference to the __asm__ keyword in C, which allows some functions to be implemented in assembly language.)

ASM是一个多功能的java 字节码分析操控框架,可用于分析现有的类、或是动态的生成二进制的类。ASM提供了一些通用的字节码转化器和分析算法,复杂的自定义的转化器和分析工具可在此基础上进行二次开发。

另外,Java也有一些其他的字节码框架,但是ASM的主要特点是高性能,因为ASM一开始的设计目标就是代码短小、且尽可能的运行快。

asm作为一个java字节码分析操作框架,要了解asm,首先了解一下java字节码结构。

2. java字节码结构

相对于其他的语言的可执行文件,java字节码结构比较简单。一个字节码包含如下内容:

  • 类的修饰符(public,private)、类名、父类、接口和类的注解;
  • field 节,每个field都有一个field 节,描述该成员的修饰符、名字、类型、和该成员上的标注;
  • 方法节,每个方法(包括构造方法)都有一个method节,描述该方法的修饰符、名字、返回类型、参数列表、方法代码、和该成员上的标注;

字节码总体结构如下图所示:
在这里插入图片描述

java源码与字节码的区别:

  • 一个字节码只和一个class对应。但是一个java 类源文件中可以包含多个类(但是只有一个public的类);
  • 字节码中没有代码注释;
  • 字节码中没有package,import语句了。所有的类型都是全限定类名。
  • 另外,字节码中存在常量池节(constant pool section) 。该节是一个数组,包含该字节码中出现的所有的数自、字符串、类型常量。这些常量只定义一次,就是在常量池中,其他节中通过数组下标(index)进行引用。

另外,类的内部名字(internal name)使用全限定名描述,但是和源码中全限定名描述不同的是内部名字用斜杠代替点号,例如对于String,其内部名字是:java/lang/String

字节码中的类型描述符:
在这里插入图片描述

字节码中的方法描述符:

在这里插入图片描述

3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值