Note About Front End Development, Vue, React, Java Spring, Maven Etc.

Finally find a place cool enough to host a blog

View on GitHub
15 December 2020

The Java ASM library learning

by libai8723

为什么要学习Java ASM呢

在上周五的可信的考试中,为了调优一个处理矩阵的代码,想要知道每一个函数执行的时间,我不得不在程序的每一段插入了代码来计算每一段的代码执行的时间。感觉非常的愚笨,于是突然想到了Java ASM的类库,之前不明白为什么操作Java的字节码,现在终于发现了,想要monitor自己写的代码的效率,看来还只能从字节码的层面来进行入手了,所以看了一下,搜索的最多的也就是这个Java ASM的类库了,那就开始学习这个类库吧。目标也很简单,一个包下面的文件每个函数的入口和出口的地方打印执行的时间戳,然后统计整个程序的运行时间段的分布。

Java ASM Library

我现在主要是读User Guide

创建ASM类库的动机

按照作者的说法,ASM库被创建出来,主要是为了分析程序,生成程序和转换程序(Program analysis, generation and transformation),下面的用途,有很多我都不知道在具体是用来做啥的,这里可以记录一下

  1. 程序分析:从简单的语法的分析(编译原理中是包含词法分析和语法分析的),到语义的分析(语义就比较有意思了,比如Intellij能识别出来循环数组拷贝,应该使用Arrays.copy来替换就是一种语义的分析了);寻找潜在的bug,寻找从来不会被执行到的代码,逆向工程(不太清楚啥意思,因为我没做过逆向工程。

  2. 程序的编译生成:包含非常传统的程序的编译生成(不明白传统的意思是包含什么),也包含编译器的stub和skeleton的生成(意思是生成一个编译器的骨架?还有什么叫做分布式的编程呢?distributed programming),以及实现JIT

  3. 程序的转换: 比如优化代码或者混淆代码(混淆这个很有用阿,代码语义上是等价的,但是混淆之后的被逆向工程的难度很大),比如插入debug或者性能监控的代码,比如AOP的实现。

ASM涵盖的处理范围(Scope)

ASM的目标是生成,转换和分析编译后的Java class文件。因为Java class文件都是以byte array的方式存储在磁盘上的,所以ASM库提供了一些读取,写入和转换byte array的api来让这个事情更加简单。

ASM是严格用来处理java class文件的,这个库不会管理class file loading到jvm的过程的。

并且ASM的API每次就是处理一个class文件的哦,如果多个class file是相互依赖的,但是这个事情ASM不关心,留给开发人员自己去处理了,这个词汇比较有意思,叫做class hierarchy

ASM程序的大致的架构(Architecture)

ASM applications have a strong architectural aspect. 终于理解这句话怎么翻译了,就是ASM程序是有一个非常清晰/严格的架构的界面/平面的。

比如按照 event based API来看,使用这类API所构建出来的程序,主要是由下面3种components来组成的:

  1. event producers (the class parser),事件的生成者,其实也就是类的匹配器。

  2. event consumers (the class writer),事件的消费者,其实也就是类的书写器。

  3. 还有很多预定义的filter

当然上面的三类构建,用户也是可以自行可以扩展的。

对于使用object API 的应用程序来说,也是有架构的界面的,也就是class的生成器和转换组件,这两种组建在object tree上进行操作。

tags: JAVA ASM