美文网首页
46 - ASN之Printer/ASMifier/Textif

46 - ASN之Printer/ASMifier/Textif

作者: 舍是境界 | 来源:发表于2022-02-26 06:51 被阅读0次

    Printer类

    class info

    第一个部分,Printer类是一个abstract类,它有两个子类:ASMifier类和Textifier类。

    public abstract class Printer {
    }
    

    fields

    第二个部分,Printer类定义的字段有哪些。

    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<Object> text;
    }
    

    constructors

    第三个部分,Printer类定义的构造方法有哪些。

    public abstract class Printer {
        protected Printer(final int api) {
            this.api = api;
            this.stringBuilder = new StringBuilder();
            this.text = new ArrayList<>();
        }
    }
    

    methods

    第四个部分,Printer类定义的方法有哪些。Printer类定义的方法是与ClassVisitor和MethodVisitor类里定义的方法有很大的相似性。

    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();
    }
    

    ASMifier类和Textifier类

    对于ASMifier类和Textifier类来说,它们的父类是Printer类。

    public class ASMifier extends Printer {
    }
    
    public class Textifier extends Printer {
    }
    

    在这里,我们不对ASMifier类和Textifier类的成员信息进行展开,因为它们的内容非常多。但是,这么多的内容都是为了一个共同的目的:通过对visitXxx()方法的调用,将class的内容转换成文字的表示形式。

    除了ASMifier和Textifier这两个类,如果有什么好的想法,我们也可以写一个自定义的Printer类进行使用。

    如何使用

    对于ASMifier和Textifier这两个类来说,它们的使用方法是非常相似的。换句话说,知道了如何使用ASMifier类,也就知道了如何使用Textifier类;反过来说,知道了如何使用Textifier类,也就知道了如何使用ASMifier类。

    从命令行使用

    Linux分隔符是“:”

    $ java -classpath asm.jar:asm-util.jar org.objectweb.asm.util.ASMifier java.lang.Runnable
    

    Windows分隔符是“;”

    $ java -classpath asm.jar;asm-util.jar org.objectweb.asm.util.ASMifier java.lang.Runnable
    

    Cygwin分隔符是“;”

    $ java -classpath asm.jar\;asm-util.jar org.objectweb.asm.util.ASMifier java.lang.Runnable
    

    从代码中使用

    无论是ASMifier类里的main()方法,还是Textifier类里的main()方法,它们本质上都是调用了Printer类里的main()方法。在Printer类里的main()方法里,代码的功能也是通过TraceClassVisitor类来实现的。

    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);
        }
    }
    

    小结

    本文对Printer、ASMifier和Textifier这三个类进行介绍,内容总结如下:

    • 第一点,了解这三个类的主要目的是为了方便理解TraceClassVisitor类的工作原理。
    • 第二点,如何从命令行使用ASMifier类和Textifier类。

    相关文章

      网友评论

          本文标题:46 - ASN之Printer/ASMifier/Textif

          本文链接:https://www.haomeiwen.com/subject/rdetrrtx.html