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

Finally find a place cool enough to host a blog

View on GitHub
16 December 2020

The Java ASM library Core API----Interface and Components

by libai8723

首先说一下这里的interface和component指的是ASM这个库针对classes的对应的编程的结构和组件组成。

ASM库中用来生成和转换编译的类文件的API是基于ClassVisitor这个抽象类的:

public abstract class ClassVisitor {

    public ClassVisitor(int api);
    public ClassVisitor(int api, ClassVisitor cv);

    public void visit(int version, int access, String name, String signature, String superName, String[] interfaces);

    public void visitSource(String source, String debug);
    
    public void visitOuterClass(String owner, String name, String desc);
    
    AnnotationVisitor visitAnnotation(String desc, boolean visible);
    
    public void visitAttribute(Attribute attr);
    
    public void visitInnerClass(String name, String outerName, String innerName, int access);

    public FieldVisitor visitField(int access, String name, String desc, String signature, Object value);

    public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions);
    
    void visitEnd();
}

这里提到了abstract class,那就好好一下这个东西,既然使用了抽象类,那也就是说,可能有很多基本的功能在ClassVisitor中已经实现了,但是有很多抽象的方法就没有实现了,想要使用的话,就需要自己来实现这个抽象类了。

StructureOfClassFiles

上面的图看起来不是很清晰,但是JVM Spec中的表达是清晰的,具体如下:

ClassFile {
    u4             magic;
    u2             minor_version;
    u2             major_version;
    u2             constant_pool_count;
    cp_info        constant_pool[constant_pool_count-1];
    u2             access_flags;
    u2             this_class;
    u2             super_class;
    u2             interfaces_count;
    u2             interfaces[interfaces_count];
    u2             fields_count;
    field_info     fields[fields_count];
    u2             methods_count;
    method_info    methods[methods_count];
    u2             attributes_count;
    attribute_info attributes[attributes_count];
}

按照asm guide中的说明,必须按照下面的顺序来调用

visit visitSource? visitOuterClass? ( visitAnnotation | visitAttribute )* ( visitInnerClass | visitField | visitMethod )* visitEnd

感觉上面上的class file structure大致能对应上,但是又不能完全对应上,有点奇怪的。

上面的ClassVisitor类中的对应的方法就是用来访问类中对应的部分(section)的,比如:

  1. visit这个方法就是用来访问class层级的,所以对应的是上面表格中的类的信息,我们可以看到一下visit的参数: 这里的ersion

         public void visit(int version, int access, String name, String signature, String superName, String[] interfaces)
    
    • version - 类文件的版本. minor version 存储在16 most significant位中,major version存储在16 least significant位中.
    • access - 表示类的访问标志例如public, private等等,see Opcodes. 也会表明这个类是否是deprecated或者是一个record?啥叫一个record.
    • name - 类的internal name
    • signature - 类的签名. 如果一个类不是一个范型的类,或者没有extend一个范型的类,或者实现一个范型的接口的话,那这个取值就是null
    • superName - 父类的inernal name
    • interfaces - 类inherited interface
  2. @todo,对于注解这种元素,对应的visitAnnotation方法是什么意思呢?

tags: JAVA ASM