文章目录
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
。
字节码中的类型描述符:
字节码中的方法描述符: