`

ASM(三) - ASM中的访问者模式

 
阅读更多

 

在ASM的Core API中使用的是访问者模式来实现对类的操作,主要包含如下类:

一、ClassVisitor接口:

在这个接口中主要提供了和类结构同名的一些方法,这些方法可以对相应的类结构进行操作。如下:


public interface ClassVisitor {
    void visit(int version,int access,String name,String signature,String superName,String[] interfaces);
    void visitSource(String source, String debug);
    void visitOuterClass(String owner, String name, String desc);
    AnnotationVisitor visitAnnotation(String desc, boolean visible);
    void visitAttribute(Attribute attr);
    void visitInnerClass(String name,String outerName,String innerName,int access);
    FieldVisitor visitField(int access,String name,String desc,String signature,Object value);
    MethodVisitor visitMethod(int access,String name,String desc,String signature,String[] exceptions);
    void visitEnd();
}

这里定义的方法调用是有顺序的,在ClassVisitor中定义了调用的顺序和每个方法在可以出现的次数,如下:

visit [ visitSource ] [ visitOuterClass ] ( visitAnnotation | visitAttribute )* (visitInnerClass | visitField | visitMethod )* visitEnd。

二、ClassReader类:

这个类会提供你要转变的类的字节数组,它的accept方法,接受一个具体的ClassVisitor,并调用实现中具体的visit,

visitSource,visitOuterClass,visitAnnotation,visitAttribute,visitInnerClass,visitField,visitMethod和visitEnd方法。

三、ClassWriter类:

这个类是ClassVisitor的一个实现类,这个类中的toByteArray方法会将最终修改的字节码以byte数组形式返回,在这个类的构造时可以指定让系统自动为我们计算栈和本地变量的大小(COMPUTE_MAXS),也可以指定系统自动为我们计算栈帧的大小(COMPUTE_FRAMES)。

四、ClassAdapter类:

这个类也是ClassVisitor的一个实现类,这个类可以看成是一个事件过滤器,在这个类里,它对ClassVisitor的实现都是委派给一个具体的ClassVisitor实现类,即调用那个实现类实现的方法。

五、AnnotationVisitor接口:

这个接口中定义了和Annotation结构想对应的方法,这些方法可以操作Annotation中的定义,如下:


public interface AnnotationVisitor {
    void visit(String name, Object value);
    void visitEnum(String name, String desc, String value);
    AnnotationVisitor visitAnnotation(String name, String desc);
    AnnotationVisitor visitArray(String name);
    void visitEnd();
}

调用顺序如下:

(visit | visitEnum | visitAnnotation | visitArray)* visitEnd

六、FieldVisitor接口:

这个接口定义了和属性结构相对应的方法,这些方法可以操作属性,如下:

public interface FieldVisitor {
    AnnotationVisitor visitAnnotation(String desc, boolean visible);
    void visitAttribute(Attribute attr);
    void visitEnd();
}

调用顺序:

( visitAnnotation | visitAttribute )* visitEnd.

七、MethodVisitor接口:

这个接口定义了和方法结构相对应的方法,这些方法可以去操作源方法,具体的可以查看一下源码。

八、操作流程:

一般情况下,我们需要操作一个类时,首先是获得其二进制的字节码,即用ClassReader来读取一个类,然后需要一个能将二进制字节码写回的类,即用ClassWriter类,最后就是一个事件过滤器,即ClassAdapter。事件过滤器中的某些方法可以产生一个新的XXXVisitor对象,当我们需要修改对应的内容时只要实现自己的XXXVisitor并返回就可以了。

 

转载:http://victorzhzh.iteye.com/blog/875759

分享到:
评论

相关推荐

    asm-2.2.3.jar,asm-commons-2.2.3.jar,asm-util-2.2.3.jar

    不过,ASM提供了高级访问者模式,降低了使用难度,使得即使不精通字节码的开发者也能较容易地使用它。 总结起来,ASM是一个强大而灵活的字节码框架,它在许多Java工具和库中扮演着重要角色。asm-2.2.3.jar、asm-...

    asm 6.0 工具集

    ASM通过访问者模式设计,使得在字节码级别进行操作变得简洁高效。ASM支持JVM规范的所有版本,包括Java 8及更高版本的特性,如lambda表达式和方法引用来实现反射和AOP(面向切面编程)。 **ASM-Util**是ASM的实用...

    asm-tree(3.0 /3.3)

    ASM访问者模式是一种设计模式,它定义了一种一对多的依赖关系,让多个访问者对象可以访问同一层次结构的对象,而不需要暴露这个层次结构的内部细节。通过这种方式,`asm-tree`使得我们可以方便地遍历和修改字节码,...

    asm-all-3.3

    6. **ASM Example**:这部分提供了示例代码,展示如何使用ASM来实现各种功能,如动态代理、代码修改等,对于初学者理解和学习ASM框架十分有帮助。 在ASM 3.3的压缩包中,`asm-3.3`很可能包含了上述所有模块的jar...

    asm-2.2.2-sources.jar.zip

    标题中的"asm-2.2.2-sources.jar.zip"是一个包含ASM库源代码的压缩文件,版本号为2.2.2。ASM是一个Java字节码操控和分析框架,常用于动态代理、代码分析或者生成自定义的字节码。这个特定的版本可能包含了ASM库的...

    asm-commons-3.0.jar.zip

    ASM的核心API包括ClassReader和ClassWriter,前者用于读取字节码,后者则负责生成新的字节码。ASM Commons在此基础上,提供了一些更高级的工具和类,如ClassAdapter,它可以方便地实现类适配器模式,简化字节码的...

    kmod-oracleasm-2.0.6.rh1-3.el6_5.x86_64.rpm

    这三者协同工作,为Oracle RAC环境提供了稳定、高效且自动化的存储解决方案。在安装和配置过程中,需要严格按照Oracle官方文档的步骤进行,以确保所有组件正确无误地集成,并且满足性能和高可用性的要求。

    asm-all-2.2.jar.zip

    "all"在文件名中通常意味着这个包集成了ASM库的所有模块,包括核心、类访问器、分析器、字节码生成器等。 描述中提到了"asm, all, 2.2, jar.zip包下载, 依赖包",这进一步确认了ASM库的版本号为2.2,并且该文件是一...

    asm-all-3.3.1-sources.jar.zip

    3. 了解如何编写访问者模式的代码,因为ASM基于访问者模式设计。 4. 注意ASM的版本兼容性,不同的Java版本可能需要对应版本的ASM库。 5. 阅读并遵循"asm-2.2.1.jar.license.txt"中的许可协议,确保合法使用。 总之...

    asm-attrs-1.5.3.jar.zip

    3. **Visitor**:ASM库采用访问者模式,使得用户可以自定义处理类、方法、字段等的逻辑。例如,`ClassAdapter`和`MethodAdapter`等适配器类可以帮助简化字节码的处理。 4. **Opcode**:ASM库提供了与Java字节码指令...

    asm-commons-3.0_RC1.jar.zip

    1. **ClassVisitor和MethodVisitor**:ASM Commons提供了这些访问者模式的实现,使得开发者可以通过简单的API来遍历和修改类及方法的字节码。 2. **Adapters**:适配器类如ClassWriter和MethodWriter,为常见的字节...

    asm-7.1.zip

    - 熟悉ASM提供的API,尤其是访问者模式的设计,它是ASM的核心编程模型。 - 谨慎操作字节码,因为错误的修改可能导致程序崩溃或安全问题。 - 利用asm-util中的工具,如ASMifier,可以帮助理解和调试生成的字节码。 ...

    asm----masm615+mirro+good1+good2

    总的来说,"asm----masm615+mirro+good1+good2"这个资源包为汇编语言学习者提供了一个实践和学习的平台,通过使用MASM615进行编程,借助Mirror进行反汇编分析,再结合"good1"和"good2"的实际案例,可以帮助学习者...

    asm-util-3.2.rar

    在本文中,我们将深入探讨ASM-Util 3.2版本中的核心概念、功能及使用方法。 首先,ASM-Util 3.2是一个与ASM主库相配套的实用工具包,它简化了对ASM API的使用,特别是对于那些不熟悉底层字节码操作的开发者来说,...

    asm-commons-3.3.zip_asm-commons-3.3.jar

    2. **Visitor API**: ASM Commons 提供了一套基于访问者模式的API,允许开发者遍历和修改类的结构。开发者可以通过继承特定的Visitor类,并重写相关的方法来实现自己的字节码操作逻辑。 3. **MethodVisitor**: 这个...

    asm-all-4.0.jar.zip

    4. **API层次结构**:ASM的API设计遵循了访问者模式,分为两种主要层次:树API和事件API。树API将字节码表示为一个类树结构,适合进行复杂的修改;事件API则基于回调,适用于简单的动态生成和修改。 5. **兼容性**...

    asm-1.4.2.jar.zip

    在使用ASM库时,开发者需要理解它的核心概念,如访问者模式,这是ASM设计的基础。ASM通过访问者对象遍历并操作类的结构,包括类、字段、方法等。此外,还需要熟悉如何创建和配置ASM的类生成器,以及如何处理字节码...

    asm-transformations.pdf

    通过采用访问者设计模式,ASM能够在处理字节码时避免大量对象的创建,从而减少时间和内存开销。这种模式使得ASM能够快速执行转换操作,并保持极低的内存使用量,这是其他框架难以匹敌的。 #### 三、字节码转换在AOP...

    asm-3.3.1.jar

    ASM是一个Java字节码操控和分析框架,常用于动态代理、代码生成以及字节码级别的程序...对于初学者,可以先从官方文档和教程入手,学习如何使用ASM读取和生成字节码,然后再逐渐深入到更复杂的字节码操作和优化中去。

    asm-jar.zip

    它包含了一些通用的访问者模式实现,以及处理注解、枚举和泛型的类。 4. asm-tree-9.0.jar:此模块提供了将字节码转换为抽象语法树(AST)的能力。AST是一种方便程序员理解和操作代码的结构化表示。ASM-Tree使得...

Global site tag (gtag.js) - Google Analytics