`
aswang
  • 浏览: 848247 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

ASM指南翻译-11 方法转换

 
阅读更多

 

3.2.3转换方法

现在,你已经猜到了,方法可以像类一样就行转换,例如,通过使用一个方法适配器来转发那些带有修改的方法调用:改变参数可以被用来变更指令,不转发某个方法调用可以删除一个指令,插入新的调用可以添加新的指令。MethodAdapter类提供了这样的基本实现,它仅仅转发它收到的所有方法调用。

 

为了弄清楚方法适配器如何使用,让我们考虑一个简单的例子,删除方法中的NOP指令(删除该指令不会带来任何问题,因为这个指令不做任何事情):

public class RemoveNopAdapter extends MethodAdapter {

         public RemoveNopAdapter(MethodVisitor mv) {

                   super(mv);

         }

         @Override

         public void visitInsn(int opcode) {

                   if (opcode != NOP) {

                            mv.visitInsn(opcode);

                   }

         }

}

 

这个适配器可以用在一个类适配器中,像下面一样:

public class RemoveNopClassAdapter extends ClassAdapter {

         public RemoveNopClassAdapter(ClassVisitor cv) {

                   super(cv);

         }

         @Override

         public MethodVisitor visitMethod(int access, String name,

                   String desc, String signature, String[] exceptions) {

                   MethodVisitor mv;

                   mv = cv.visitMethod(access, name, desc, signature, exceptions);

                   if (mv != null) {

                            mv = new RemoveNopAdapter(mv);

                   }

                   return mv;

         }

}

 

这个类适配器主要用来构建方法适配器,该适配器封装链上的下一个Class Visitor返回的方法适配器,然后返回该适配器。这个方法适配器链构造的效果类似于之前的类适配器链(参看图3.5)。

 

尽管上面的要求不是强制性的,但是仍然可能构造一个与类适配器链不同的方法适配器链。每个方法甚至都可以有一个不同的方法适配器链。例如,类适配器可以选择在方法中而不是构造方法中移除NOP指令。可以像下面这样来实现:

...

mv = cv.visitMethod(access, name, desc, signature, exceptions);

if (mv != null && !name.equals("<init>")) {

mv = new RemoveNopAdapter(mv);

}

...

 




3.5 RemoveNopAdapter序列图

 

在这个例子中,针对构造方法的适配器链要短一些。相反地,针对构造方法的适配器链也可以更长,可以将几个方法适配器在visitMethod方法内部链接在一起。方法适配器链也可以拥有与类适配器链不同的拓扑图结构。例如,类适配器链应该是线性的,而方法适配器可以有分支:

public MethodVisitor visitMethod(int access, String name,

         String desc, String signature, String[] exceptions) {

         MethodVisitor mv1, mv2;

         mv1 = cv.visitMethod(access, name, desc, signature, exceptions);

         mv2 = cv.visitMethod(access, "_" + name, desc, signature, exceptions);

         return new MultiMethodAdapter(mv1, mv2);

}

 

现在,我们已经了解了如何在一个类适配器中使用方法适配器,以及如何组装它们,下面让我们来看看如何实现比RemoveNopAdapter更有趣的适配器。

 

  • 大小: 20.7 KB
1
2
分享到:
评论

相关推荐

    ASM3.0指南翻译

    ### ASM3.0指南翻译——深入理解Java字节码引擎库 #### 1. 引言与背景 在软件开发领域,程序分析、生成及转换技术的应用极为广泛,覆盖从语法解析到语义分析,再到代码优化、混淆、调试、性能监控及面向切面编程等...

    ASM4使用指南.pdf

    根据提供的文件信息,以下是关于“ASM4使用指南.pdf”文档中所提及知识点的详细介绍: 1. ASM库介绍: ASM(Java字节码操作和分析框架)是一个Java字节码操作与分析框架。它被设计用于直接以类文件的形式读写和修改...

    asm4-guide

    - Adding and removing class members:说明了如何使用ASM库向类中添加或移除成员(字段、方法等)。 - Generating classes:描述了如何使用ASM生成新的类。 - Parsing classes:说明了ASM如何解析已有的类文件。 ...

    ASM30-LINK30和实用程序用户指南

    根据给定的文件信息,我们可以提炼出以下几个关键的知识点,主要围绕着ASM30-LINK30和实用程序用户指南,以及Microchip Technology Inc.的相关信息进行深入解析: ### 1. 微芯科技(Microchip Technology Inc.)...

    asm操作指南(中文)

    ### asm操作指南(中文)知识点总结 #### 一、ASM框架简介 - **定义与功能**:ASM是一个Java字节码操纵框架,主要用于动态生成类或增强现有类的功能。通过直接生成二进制`.class`文件,ASM能够在类被加载到Java...

    ASM4使用指南

    它不仅提供了关于如何使用库的详细指南,还对 ASM4 在程序分析、生成和转换方面的作用提供了深刻的理解。这不仅包括 ASM4 的基本概念和架构,还包括更高级的主题,例如如何利用 ASM4 实现高效的类文件分析和转换,...

    asm-guide.rar

    在阅读《ASM指南》的过程中,你将逐步掌握ASM的基本用法,包括类、字段和方法的解析,以及如何生成和修改字节码。同时,书中还会提供丰富的示例代码,帮助你快速上手并应用于实际项目中。 总之,《ASM指南》是一本...

    ASM7使用指南.pdf

    ### ASM7使用指南知识点 #### 1. 引言与动机 **ASM**(Abstract Syntax Model)是一款专门针对Java字节码操作的强大工具库,它主要用于程序分析、生成及转换等场景。根据提供的文档信息来看,尽管标题为“ASM7使用...

    asm4使用指南(强烈推荐)

    标题《asm4使用指南(强烈推荐)》以及描述《java使用asm4操作字节码技术,详细介绍了asm如何对java的字节码进行操作,强烈推荐》指明了文档的核心内容是介绍ASM4这一工具在Java字节码层面操作的指南,并且给出了...

    asm-2.0.jar.zip

    1. **字节码解析**:ASM可以解析Java类文件,将其转换为一个内部表示形式,这样就可以方便地访问类的结构,如类名、方法、字段等。 2. **字节码生成**:除了解析,ASM还支持生成新的字节码,允许开发者动态创建或...

    asm的jar包

    ASM是一个Java字节码操控和分析框架,常用于动态代理、代码分析以及转换等场景。它的核心在于提供了一种能够直接操作和修改Java类文件的底层API,这使得开发者能够深入到Java字节码级别进行编程,实现一些高级功能,...

    ASM1061资料文件.rar

    3. 可能还会有用户手册、数据手册或者开发者指南,这些文档提供了关于ASM1061的详细规格、操作指南和应用示例,帮助用户更好地理解和使用这款芯片。 如果需要CADENCE源文件,那可能是指用CADENCE软件设计的电路板...

    NASM 帮助文档 语法

    NASM是一个高级汇编语言编译器,能够将汇编语言源代码转换为机器码。其主要特性包括:支持多种目标格式、强大的预处理器、易于移植、具备良好的文档等。由于其高效性和灵活性,广泛应用于操作系统开发、系统编程以及...

    Asm-Guide

    Asm 支持通过一系列的转换器来构建复杂的转换链,从而实现更为复杂的字节码操作。 ##### 2.3 工具 Asm 还提供了一些有用的工具类来简化开发过程。 ##### 2.3.1 Type 类 Type 类提供了一系列静态方法来处理 Java ...

    ASM3042.zip

    本文将围绕"ASM3042.zip"这个压缩包文件,深入探讨ASM3042芯片在USB host到PCIE转换应用中的关键知识点,以及相关的硬件设计。 ASM3042是一款专门用于实现USB host到PCIE转换的集成电路,其核心功能是将USB设备的...

    asm-all_3.1

    在ASM 3.1的压缩包中,`asm-3.1`文件包含了所有必要的类库和文档,包括ASM的主要API类、辅助工具类以及相关的用户指南和API文档。通过这些资源,开发者可以快速上手并熟练掌握ASM的用法。 使用ASM 3.1时,开发者...

    ASM中文帮助文档

    ASM是Java字节码操作和分析框架,它允许程序员在运行时动态生成和修改类和方法。ASM的主要用途包括创建动态代理、代码分析、代码优化以及AOP(面向切面编程)实现。以下是对ASM这一高级Java技术的详细解读: 1. **...

    ASM4使用指南_全网最完美版本.pdf

    《ASM4 使用指南》是一本深入探讨ASM库的著作,ASM是专为Java设计的类生成和转换工具。这本书详细介绍了ASM如何在运行时对已编译的Java类进行分析、生成和转换,同时强调了ASM库的高效、小巧和易用性。以下是ASM4的...

Global site tag (gtag.js) - Google Analytics