ASM:(4)如何编写ASM代码
作者:互联网
原文:https://lsieun.github.io/java-asm-01/how-to-write-core-code.html
在刚开始学习ASM的时候,编写ASM代码是不太容易的。或者,有些人原来对ASM很熟悉,但由于长时间不使用ASM,编写ASM代码也会有一些困难。在本文当中,我们介绍一个ASMPrint
类,它能帮助我们将.class
文件转换为ASM代码,这个功能非常实用。
ASMPrint类
下面是ASMPrint
类的代码,它是利用org.objectweb.asm.util.TraceClassVisitor
类来实现的。在使用的时候,我们注意修改一下className
、parsingOptions
和asmCode
参数就可以了。
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.util.ASMifier;
import org.objectweb.asm.util.Printer;
import org.objectweb.asm.util.Textifier;
import org.objectweb.asm.util.TraceClassVisitor;
import java.io.IOException;
import java.io.PrintWriter;
/**
* 这里的代码是参考自{@link org.objectweb.asm.util.Printer#main}
*/
public class ASMPrint {
public static void main(String[] args) throws IOException {
// (1) 设置参数
String className = "com.wj.asm.print.HelloWorld";
int parsingOptions = ClassReader.SKIP_FRAMES | ClassReader.SKIP_DEBUG;
boolean asmCode = true;
// (2) 打印结果
Printer printer = asmCode ? new ASMifier() : new Textifier();
PrintWriter printWriter = new PrintWriter(System.out, true);
TraceClassVisitor traceClassVisitor = new TraceClassVisitor(null, printer, printWriter);
new ClassReader(className).accept(traceClassVisitor, parsingOptions);
}
}
在现在阶段,我们可能并不了解这段代码的含义,没有关系的。现在,我们主要是使用这个类,来帮助我们生成ASM代码;等后续内容中,我们会介绍到TraceClassVisitor
类,也会讲到ASMPrint
类的代码,到时候就明白这段代码的含义了。
ASMPrint类使用示例
假如,有如下一个HelloWorld
类:
public class HelloWorld {
public void test() {
System.out.println("Test Method");
}
}
对于ASMPrint
类来说,其中
className
值设置为类的全限定名,可以是我们自己写的类,例如com.wj.asm.print.HelloWorld
,也可以是JDK自带的类,例如java.lang.Comparable
。asmCode
值设置为true
或false
。如果是true
,可以打印出对应的ASM代码;如果是false
,可以打印出方法对应的Instruction。parsingOptions
值设置为ClassReader.SKIP_CODE
、ClassReader.SKIP_DEBUG
、ClassReader.SKIP_FRAMES
、ClassReader.EXPAND_FRAMES
的组合值,也可以设置为0
,可以打印出详细程度不同的信息。
执行上面的main方法的效果:
功能拆分
上面介绍的ASMPrint
类,是一个功能二合一的类,它既可以打印Core API的代码,也可以查看类的内容。 为了方便理解,我们将它拆分成PrintASMCodeCore
类和PrintASMTextClass
类。
PrintASMCodeCore
类:打印Core API的代码。PrintASMTextClass
类:打印类的内容。
另外,项目当中也提供了PrintASMCodeTree
类和PrintASMTextLambda
类:
PrintASMCodeTree
类:打印Tree API的代码。PrintASMTextLambda
类:打印Lambda表达式生成的内部类的内容。
总结
本文主要介绍了ASMPrint
类和它的使用示例,内容总结如下:
- 第一点,
ASMPrint
类,是通过org.objectweb.asm.util.TraceClassVisitor
实现的。 - 第二点,
ASMPrint
类的作用,是帮助我们生成ASM代码。当我们想实现某一个功能时,不知道如何下手,可以使用ASMPrint
类生成的ASM代码,作为思考的起点。
在当前的阶段,我们可能并不了解ASMPrint
类里面代码的含义,但是并不影响我们使用它,让它来帮助我们生成ASM代码。
标签:ClassReader,代码,ASMPrint,ASM,org,编写,asm 来源: https://www.cnblogs.com/wwjj4811/p/16113495.html