`

ASM(四) - ASM定类、方法、属性

 
阅读更多

下面三篇文章讲解怎么定义类、方法、变量等说的很详细 明了。

 

http://alvinqq.iteye.com/blog/940960

 

http://alvinqq.iteye.com/blog/940965

 

http://alvinqq.iteye.com/blog/940970

 

 

一、如何使用ASM

      ASM提供了两套API供使用者使用,一套叫Core API,是基于事件的方式对字节码进行处理;另一套叫Tree API,是基于对象的方式对字节码进行处理。如果你熟悉XML解析,那么实际上Core API就是SAX这种处理模式,而Tree API就是DOM这种处理模式。


二、Core API

     使用Core API进行对字节码进行处理一般需要三个部分:

  • 一个事件的生产者,用于产生各种事件,通常这会是一个ClassReader
  • 一个事件的消费者,用于消费各种事件,通常这会是一个ClassWriter
  • 若干个事件的过滤器,这些过滤器可以对感兴趣的事件进行过滤来处理,这通常会是一些ClassVisitor

其处理过程如下图所示:

 从文件流中读入一个待处理的Class文件,然后new了ClassReader,作为事件源,然后new了一个ClassWriter,作为事件的接收者,还实现了一个ClassVisitor,这个ClassVisitor将所有的public方法变成了private的方法。接着通过调用cr.accept方法来触发事件,通过cw.toByteArray来拿到处理后的字节码并且输出到文件。

从前面的图可以看出,采用Core API处理字节码,其实就是通过继承ClassVisitor,并且覆盖ClassVisitor中的对应的方法来对特定的事件进行处理的过程,其实这里的事件基本上对应到了Class文件中的各个部分,除了常量池部分,所以如果了解了Class文件的结构,那么用Core API处理起来应该得心应手。

除了ClassVisitor之外,Core API还提供了MethodVisitorFieldVisitorAnnotationVisitor对方法,字段和注解操作。 

 

三、 Tree API

      Tree API是基于对象的方式来处理字节码,Tree API的最核心的一个类就是ClassNode它就代表了一个Java Class文件,它里面的属性对应到了一个Class文件的各个部分。

 

ClassNode,用来创建一个继承了java.lang.Runnable接口的接口ASMInterface,它包含了一个方法public void stop(),最后将生成的字节码通过ClassWriter输出到文件。

和创建类一样,通过Tree API修改一个类也只需要修改ClassNode的属性。如果你要修改方法,字段或者注解,那么可以通过ClassNode拿到MethodNodeFieldNodeAnnotationNode来进行对应的修改。

 

四、什么时候使用Core API,什么时候使用Tree API?

Core API和Tree API其实各有优缺点:

  • Core API的优势是处理速度快,占用内存小,因为它不需要在内存中将整个Class文件表示出来,缺点是基于事件的方式处理,如果错过一个事件,那么就是过了这个村,没有这个店了,这样如果需要实现诸如将特定GOTO出插入其他指令,就会比较麻烦,因为GOTO可以跳转到之前的指令,但是之前的指令的事件已经被处理了,到时候只能再次触发一遍事件来处理。
  • Tree API的优势就是Core API的劣势,对于上面提到的GOTO的这种情况,Tree API处理起来就轻松了很多,因为在内存中有Class文件的完整表示,随便什么样的顺序去改都是没有问题的。缺点就是占用内存比较大,处理速度比较慢。

如果你查看ClassNode的源代码,那么可以发现ClassNode事实上继承了ClassVisitor。那么,我们就可以将在实际操作的时候将Core API和Tree API结合起来,灵活运用各自的优缺点去解决问题。

五、辅助工具类

ASM除了提供了Core API和Tree API两套API以外,还提供了几个比较实用的工具类

CheckClassAdapter

实际上,用ASM生成的字节码可能并不符合Java虚拟机规范的,如果需要检查生成的字节码符不符合规范,那么可以用CheckClassAdapter作为一个ClassVisitor加入到ClassVisitor链中,如果字节码不符合规范,那么CheckClassAdapter就会抛出异常。

ASMifier

ASM作为一个字节码操作工具,相对于其他的字节码操作工具,比如Javassist,写起来还是比较烦琐的,如果你已经有了一个Class文件,想要知道如何通过ASM生成这个Class文件,那么就可以直接用ASMifier这个类,通过这个类,可以直接生成出生成目标类的ASM代码,一定程度上简化了直接手写ASM代码的繁琐工作。

ASMifier可以直接通过命令行来使用,比如那我们刚才生成的那个ASMInterface为例:

 

 

可以看到ASMifier直接将生成ASMInterface所需要的ASM代码直接打印出来了。

LocalVariableSorter

假设你要往一个方法里面加入一个本地变量,那么你就需要将这个变量加入到本地变量表的最后,遗憾的是,本地变量表的大小只有当你在调用visitMaxs的时候才知道,通常,这个时候已经到了方法的结尾处,再想加本地变量已经晚了,现在通过LocalVariableSorter这个ClassVisitor,你就可以非常简单插入一个本地变量。

 

转载:http://www.khotyn.com/2012/03/06/asm_note/

 

  • 大小: 53.5 KB
  • 大小: 27.4 KB
  • 大小: 77 KB
分享到:
评论

相关推荐

    asm4-guide.pdf

    Java class 被存储在严格格式定义的 .class 文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性以及 Java 字节码(指令)。ASM 从类文件中读入信息后,能够改变类行为,分析类信息,甚至...

    asm-9.0.jar

    Java class 被存储在严格格式定义的 .class文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性以及 Java 字节码(指令)。ASM从类文件中读入信息后,能够改变类行为,分析类信息,甚至...

    asm-tree-3.3.1.jar

    例如,可以使用ASM Tree API遍历一个类的整个字节码结构,查找并修改特定的指令或属性,或者在运行时动态生成新的类和方法。此外,由于ASM Tree API具有较高的抽象层次,因此它适用于各种类型的Java字节码操作,无论...

    java操作Excel环境easyExcel-2.0.5最新版本环境(自动适配属性),解决asm及cglib冲突等。亲测可用。

    java操作Excel环境easyExcel-2.0.5最新版本环境(自动适配属性),解决asm及cglib冲突等。亲测可用。asm.jar cglib-2.2.jar cglib-3.1.jar cglib-nodep-2.2.jar commons-collections4-4.1.jar easyexcel-2.0.5.jar ...

    asm4.1 jar+demo+doc

    Java class 被存储在严格格式定义的 .class 文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性以及 Java 字节码(指令)。ASM 从类文件中读入信息后,能够改变类行为,分析类信息,甚至...

    Java字节码操纵框架 asm-3.1组件包大集合

    Java class 被存储在严格格式定义的 .class 文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性以及 Java 字节码(指令)。ASM 从类文件中读入信息后,能够改变类行为,分析类信息,甚至...

    asm 最新版手册

    Java class 被存储在严格格式定义的 .class 文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性以及 Java 字节码(指令)。ASM 从类文件中读入信息后,能够改变类行为,分析类信息,甚至...

    asm操作指南(中文)

    Java class 被存储在严格格式定义的 .class文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性以及 Java 字节码(指令)。ASM从类文件中读入信息后,能够改变类行为,分析类信息,甚至...

    asm5.0 源码+demo+doc

    Java class 被存储在严格格式定义的 .class 文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性以及 Java 字节码(指令)。ASM 从类文件中读入信息后,能够改变类行为,分析类信息,甚至...

    ASM4中文使用指南.zip

    Java class 被存储在严格格式定义的 .class 文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性以及 Java 字节码(指令)。ASM 从类文件中读入信息后,能够改变类行为,分析类信息,甚至...

    PhoneBook-ASM-Jv1

    *更新:分配管理电话簿项目结构包括:Main.Class(包括主功能,菜单)Nguoi.Class(超级类-包括属性:Ho,Ten,TenDem,NamSinh,GioITinh-inRaManHinh())DanhBa.Class(子类-继承父类的属性,包括对象的属性,...

    初学asm的简单例子

    【例2.8】存储器与寄存器间数据传送。...第四步:运行可执行文件EXAM?EXE A>EXAM 运行结果如下: I am a student! 若未得到预期的结果,可检查EXAM?ASM文件内容,修改错误,再次汇编、连接、运行,直到满意为止。

    gb-asm-tutorial:在线Game Boy汇编编程教程

    gb-asm-tutorial 在线游戏男孩组装编程教程,位于 。 结构 docs文件夹是公开提供的docs夹。 (注意:GitHub Pages仅考虑master分支的docs文件夹。) src文件夹包含所有“源” HTML文件,按语言排序。 (由于历史...

    最新Struts2+jq+ajax+json 学会总要4步‵‵超级简单,里面包含实例

    要进行json序列的属性一定要有getter器 规则2.可以通过注解方式声明如(@JSON(name="newName")) 注意:要导入import com.googlecode.jsonplugin.annotations.JSON; 4. 获取json中的数据可以通过访问对象的方式 如...

    Java字节码和asm入门资料

    NULL 博文链接:https://xpenxpen.iteye.com/blog/2194267

    asm 汇编语言基础知识

    这样,当程序执行到主程序的最后一条指令RET时,由于该过程具有FAR属性,故存在堆栈内的两个字就分别弹出到CS和IP,从而执行INT 20H指令,使控制返回到DOS状态。返回DOS的标志就是程序运行完后出现一个DOS的标识符,...

    月亮HTTP代理列表 1.12

    并使用C32Asm编辑后获得。 原软件介绍: 自动公布大量最新可用的HTTP代理IP,程序即时验证代理的可用性, 保证列出的代理全部可用。 --去掉了原软件内的流氓插件百度搜霸。 --去掉了原软件内的流氓插件88圈。 ...

    OSGi中基于ASM的动态服务更新模型

    本文提供了一种基于OSGi的面向服务系统的基于ASM的高级语义模型,并支持服务动态更新。 该模型不仅提供了优化方法,还提供了指定OSGi约束的最终模型。 生成的形式模型可以以多种方式应用。 首先,它可以检查或比较...

    xalanjava源码-rcjp:使用ASM库检测Java字节码,实现一个简单的引用计数模型来测试Java程序

    本项目旨在从Java程序中发现Whole-Part关系中存在的一些详细属性。 构建检测程序以跟踪 Java 程序中实例的行为并生成跟踪文件。 它可以在某些类加载到 JVM 时修改 Java 字节码。 关系分析基于跟踪文件。 在分析中,...

    自己动手写操作系统

    3.1.3 描述符属性47 3.2 保护模式进阶50 3.2.1 海阔凭鱼跃50 3.2.2 LDT(Local Descriptor Table)58 3.2.3 特权级62 3.3 页式存储82 3.3.1 分页机制概述83 3.3.2 编写代码启动分页机制84 3.3.3 PDE和PTE85 ...

Global site tag (gtag.js) - Google Analytics