Java ASM系列:(036)Printer/ASMifier/Textifier介绍

本文属于[Java ASM系列一:Core API](https://blog.51cto.com/lsieun/2924583)当中的一篇。 ## 1. Printer类 ### 1.1 class info 第一个部分,`Printer`类是一个`abstract`类,它有两个子类:`ASMifier`类和`Textifier`类。 ```java public abstract class Printer { } ``` ### 1.2 fields 第二个部分,`Printer`类定义的字段有哪些。 ```java public abstract class Printer { protected final int api; // The builder used to build strings in the various visit methods. protected final StringBuilder stringBuilder; // The text to be printed. public final List text; } ``` ### 1.3 constructors 第三个部分,`Printer`类定义的构造方法有哪些。 ```java public abstract class Printer { protected Printer(final int api) { this.api = api; this.stringBuilder = new StringBuilder(); this.text = new ArrayList<>(); } } ``` ### 1.4 methods 第四个部分,`Printer`类定义的方法有哪些。`Printer`类定义的方法是与`ClassVisitor`和`MethodVisitor`类里定义的方法有很大的相似性。 ```java public abstract class Printer { // Classes,这部分方法可与ClassVisitor内定义的方法进行对比 public abstract void visit(int version, int access, String name, String signature, String superName, String[] interfaces); public abstract Printer visitField(int access, String name, String descriptor, String signature, Object value); public abstract Printer visitMethod(int access, String name, String descriptor, String signature, String[] exceptions); public abstract void visitClassEnd(); // ...... // Methods,这部分方法可与MethodVisitor内定义的方法进行对比 public abstract void visitCode(); public abstract void visitInsn(int opcode); public abstract void visitIntInsn(int opcode, int operand); public abstract void visitVarInsn(int opcode, int var); public abstract void visitTypeInsn(int opcode, String type); public abstract void visitFieldInsn(int opcode, String owner, String name, String descriptor); public void visitMethodInsn(final int opcode, final String owner, final String name, final String descriptor, final boolean isInterface); public abstract void visitJumpInsn(int opcode, Label label); // ...... public abstract void visitMaxs(int maxStack, int maxLocals); public abstract void visitMethodEnd(); } ``` ## 2. ASMifier类和Textifier类 对于`ASMifier`类和`Textifier`类来说,它们的父类是`Printer`类。 ```java public class ASMifier extends Printer { } ``` ```java public class Textifier extends Printer { } ``` 在这里,我们不对`ASMifier`类和`Textifier`类的成员信息进行展开,因为它们的内容非常多。但是,这么多的内容都是为了一个共同的目的:通过对`visitXxx()`方法的调用,将class的内容转换成文字的表示形式。 除了`ASMifier`和`Textifier`这两个类,如果有什么好的想法,我们也可以写一个自定义的`Printer`类进行使用。 ## 3. 如何使用 对于`ASMifier`和`Textifier`这两个类来说,它们的使用方法是非常相似的。换句话说,知道了如何使用`ASMifier`类,也就知道了如何使用`Textifier`类;反过来说,知道了如何使用`Textifier`类,也就知道了如何使用`ASMifier`类。 ### 3.1 从命令行使用 Linux分隔符是“:” ```text $ java -classpath asm.jar:asm-util.jar org.objectweb.asm.util.ASMifier java.lang.Runnable ``` Windows分隔符是“;” ```text $ java -classpath asm.jar;asm-util.jar org.objectweb.asm.util.ASMifier java.lang.Runnable ``` Cygwin分隔符是“\;” ```text $ java -classpath asm.jar\;asm-util.jar org.objectweb.asm.util.ASMifier java.lang.Runnable ``` ### 3.2 从代码中使用 无论是`ASMifier`类里的`main()`方法,还是`Textifier`类里的`main()`方法,它们本质上都是调用了`Printer`类里的`main()`方法。在`Printer`类里的`main()`方法里,代码的功能也是通过`TraceClassVisitor`类来实现的。 ```java import org.objectweb.asm.util.ASMifier; import java.io.IOException; public class HelloWorldRun { public static void main(String[] args) throws IOException { String[] array = new String[] { "-debug", "sample.HelloWorld" }; ASMifier.main(array); } } ``` ## 4. 总结 本文对`Printer`、`ASMifier`和`Textifier`这三个类进行介绍,内容总结如下: - 第一点,了解这三个类的主要目的是为了方便理解`TraceClassVisitor`类的工作原理。 - 第二点,如何从命令行使用`ASMifier`类和`Textifier`类。
上一篇:2. ResNet -- 经典论文阅读


下一篇:android4.0 禁止横竖屏切换使用 android:configChanges="orientation|keyboardHidden"无效的解决方法