ASM是什么
简单来说,ASM是一个Java字节码的类库。
问题一:ASM的操作对象是什么?
ASM所操作的对象是字节码(ByteCode)数据。
一个.java
文件经过Java编译器(javac
)编译之后会生成一个.class
文件,在.class
文件中,存储的是字节码(ByteCode
)数据,ASM所操作的对象是字节码,而在许多情况下,字节码的具体形式是.class
文件。
问题二:ASM是如何处理字节码数据的?
ASM处理字节码数据的思路是:
- 第一步将
.class
文件拆分成多部分; - 对某一个部分的信息进行修改;
- 将多个部分重新组织成一个新的
.class
文件
ASM provides a simple API for decomposing, modifying, and recomposing binary java classes(i.e ByteCode).
ASM的版本发展
- Java语言在不断发展,ASM版本也要不断发展来跟上Java的发展
- 在选择ASM版本时,需注意它支持的Java版本,来确保兼容性
版本对应关系表:
ASM Release | Release Date | Java Support |
---|---|---|
2.0 | 2005-05-17 | Java 5 language support |
3.2 | 2009-06-11 | support for the invokedynamic code |
4.0 | 2011-10-29 | Java 7 language support |
5.0 | 2014-03-16 | Java 8 language support |
6.0 | 2017-09-23 | Java 9 language support |
6.1 | 2018-03-11 | Java 10 language support |
7.0 | 2018-10-27 | Java 11 language support |
7.1 | 2019-03-03 | Java 13 language support |
8.0 | 2020-03-03 | Java 14 language support |
9.0 | 2020-09-22 | Java 16 language support |
9.0 | 2021-02-06 | Java 17 language support |
9.2 | 2021-06-26 | Java 18 language support |
ASM能做什么
- 类文件分析(Analysis)
- 动态生成新的类文件(Generation),这是一个从“无”到“有”,从0到1生成类文件的操作。
- 对已有的类文件进行转换,从而生成新的类文件(Transformation)
ASM使用场景
- the OpenJDK, to generate the lambda call sites, and also in the Nashorn compiler,
- the Groovy compiler and the Kotlin compiler,
- Cobertura and Jacoco, to instrument classes in order to measure code coverage,
- CGLIB, to dynamically generate proxy classes (which are used in other projects such as Mockito and EasyMock),
- Gradle, to generate some classes at runtime.
小结
- ASM所处理对象是字节码数据,也可以直观的理解成.class文件,不是.java文件。
- ASM能够对字节码数据进行哪些操作呢?回答:analyze、generate、transform。
- ASM可以形象的理解为“Java语言世界”的边缘上一扇大门,通过这扇大门,可以帮助我们进入到“字节码的世界”。
本文带大家了解了ASM是什么,以及ASM能做什么,学会使用ASM对将会让大家掌握一项更灵活的技术,希望对大家能有所帮助。
网友评论