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

ASM指南翻译-3

 
阅读更多

2.1接口和组件

 

2.2.1表现Presentation

生成和转换编译后的类的ASM API是基于ClassVisitor接口的(见图2.4)。在这个接口中的每一个方法都与类文件中有着相同名称的段相对应(见图2.1)。在访问类结构中简单的段时,是通过调用一个独立的方法来实现的,该方法的参数就是该段相关的内容,该方法的返回值为void。对长度任意并且较复杂的段进行访问时,是通过一个初始化方法返回一个辅助的visitor接口来实现,例如visitAnnotationvisitField以及visitMethod,它们都返回与之对应的接口AnnotationVisitorFieldVisitor以及MethodVisitor

 

这些规则也同样适用于这些辅助接口。例如,在FieldVisitor接口中的每个方法,都与类文件结构中与该名称(Field)对应的子结构对应(见图2.5),并且visitAnnotation并会一个辅助的AnnotationVisitor接口,与ClassVisitor中的AnnotationVisitor相同。关于这些辅助接口的创建和使用,将在下一章节介绍,这一章主要限于那些简单的问题,使用ClassVisitor接口就可以解决的。


2.4 ClassVisitor接口


2.5 FieldVisitor接口

ClassVisitor接口中方法的调用必须遵循下面文档定义的顺序,该文档定义在ClassVisitor接口的Javadoc中。

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

visitEnd

 

这就意味着visit必须被第一个调用,然后调用visitSource方法,最多调用一次,再接着是visitOuterClass,然后再调用任意次数的visitAnnotation或者visitAttribute方法,接着可以调用任意次数的visitInnerClassvisitiField或者visitMethod,顺序不限,在最后,调用visitEnd方法。

ClassVisitor接口的基础上,ASM提供了三个组件来生成和转换类:

  • ClassReader 用来解析编译过的class的字节数组。然后,调用ClassVisitor实例的visitXxx方法,其中ClassVisitor实例作为ClassReader.accept方法的参数传递进去的。ClassReader可以被看做是一个事件产生者。
  • ClassWriterClassVisitor接口的一个实现,用来以二进制方式构建编译后的类。它产生一个包含编译后的类的字节数组,可以通过它的toByteArray方法来或得。它可以被看做是一个事件消费者。
  • ClassAdapter也是ClassVisitor接口的一个实现,它将对它的方法调用委托给另一个ClassVisitor。它可以被认为是一个事件过滤器。

接下来,将结合具体的例子来展示如何使用这些组件来生成和转换类。

 

2.2.2解析类

解析一个已存在的类仅需要ClassReader这个组件。下面让我们以一个实例来展示如何解析类。假设,我们想要打印一个类的内容,我们可以使用javap这个工具。第一步,实现ClassVisitor这个接口,用来打印类的信息。下面是一个简单的实现:

public class ClassPrinter implements ClassVisitor {

         public void visit(int version, int access, String name,

                   String signature, String superName, String[] interfaces) {

                   System.out.println(name + " extends " + superName + " {");

         }

         public void visitSource(String source, String debug) {

         }

         public void visitOuterClass(String owner, String name, String desc) {

         }

         public AnnotationVisitor visitAnnotation(String desc,

                   boolean visible) {

                   return null;

         }

         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) {

                   System.out.println(" " + desc + " " + name);

                   return null;

         }

         public MethodVisitor visitMethod(int access, String name,

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

                   System.out.println(" " + name + desc);

                   return null;

         }

         public void visitEnd() {

                   System.out.println("}");

         }

}

第二步,将ClassPrinterClassReader结合起来,这样,ClassReader产生的事件就可以被我们的ClassPrinter消费了:

ClassPrinter cp = new ClassPrinter();

ClassReader cr = new ClassReader("java.lang.Runnable");

cr.accept(cp, 0);

 

上面的第二行代码创建了一个ClassReader来解析Runnable类。最后一行代码中的accept方法解析Runnable类的字节码,并且调用cp上对应的方法。结果如下:

java/lang/Runnable extends java/lang/Object {

run()V

}

 

注意,这里有多种方式来构造一个ClassReader的实例。可以通过类名,例如上面的例子,或者通过类的字节数组。或者类的输入流。类的输入流可以通过ClassLoadergetResourceAdStream方法:

cl.getResourceAsStream(classname.replace(’.’, ’/’) + ".class");

  • 大小: 86.5 KB
  • 大小: 22.4 KB
2
0
分享到:
评论

相关推荐

    ASM3.0指南翻译

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

    ASM4使用指南.pdf

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

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

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

    C32Asm 反汇编工具

    在压缩包中的"读我.txt"文件,很可能是C32Asm的使用指南或注意事项,它可能包含了安装步骤、配置选项、命令行参数以及一些使用技巧。而"c32asm"可能是个可执行文件,即C32Asm工具本身,或者是一个示例文件,用于演示...

    反汇编工具 win32asm

    描述中提到的“汉化了的,好用”,意味着这个win32asm工具已经被翻译成了中文,这对于中文用户来说是一个极大的便利,因为它消除了语言障碍,使得不懂英文的开发者也能轻松使用。通常,反汇编器的界面和文档都是英文...

    《Win32asm与Radasm开发教程》第二阶段视频的代码和资料下载

    《汇编程序员之代码风格指南》,此书是我自己翻译的中文版,网上已有很多 地方可下载,学习汇编语言而不注意编码风格是很吃亏的事,此书能教你什么时候 该做什么,什么时候不应该做什么。良好的编码风格对于win32...

    ADS开发工具详细教程

    - `armasm.exe`:ARM汇编器,用于将汇编语言翻译成机器码。 - `armcc.exe`:ARM C编译器,用于将C语言源代码编译成汇编代码或机器码。 - `armcpp.exe`:ARM C++编译器,用于处理C++源代码。 - `armlink.exe`:...

    汇编程序员之代码风格指南

    本指南由著名的汇编语言专家Randall Hyde撰写,并由jhkdiy翻译成中文版。该指南旨在帮助程序员理解如何提高他们所编写的汇编代码的可读性。书中通过一系列实例来展示常见的问题及其解决方案,这些实例均来自互联网上...

    GCC中文手册.PDF

    本中文手册是由一位热心人士翻译整理的,其内容主要摘自GNU C编译器的官方文档。手册旨在为用户提供一个简明扼要的GCC使用指南,特别是针对编译器选项的解释。 #### 二、手册重要声明 1. **免责声明**:手册的内容...

    c++实现的mips汇编器

    - `ReadMe.txt`:通常包含项目说明、使用指南或者注意事项。 - `ConsoleApplication1`:可能是C++编译生成的可执行程序,包含了汇编和反汇编的功能。 - `汇编与反汇编exe`:这可能是最终生成的汇编和反汇编器的可...

    INTEL开发手册-四卷集-卷3(中文版).pdf

    《IA-32 Intel®架构软件开发手册-四卷集-卷3(中文版)》是该系列中文翻译版本中的第三卷,它聚焦于系统编程,涵盖了IA-32架构下操作系统设计的核心部分。该手册不仅翻译了英文版本,还针对中文读者进行了适当的本地...

    AsmToE汇编机器码转换工具

    - 中文伪指令.txt 可能包含了易语言中的特殊指令,这些指令在易语言中用中文表示,但被翻译为对应的汇编指令。 - 测试代码.txt 包含了一些示例代码,用于测试软件的功能和性能。 - 高级指令.txt 可能介绍了更复杂或...

    Linux 汇编语言开发指南

    ### Linux 汇编语言开发指南 #### 一、简介 汇编语言作为一种低级语言,在现代编程领域中虽然不如高级语言那样普及广泛,但它在特定场景下的优势不容忽视。尤其是在Linux环境中,汇编语言被用于优化性能敏感的模块...

    Windows 汇编语言编程指南

    全部翻译完了,给我的感觉就是这篇文章是为已有汇编基础但从未接触过Windows汇编编程的读者写的,虽然对我来说这些内容很简单,但也觉得说的很详细了,好过国内许多三言两语的所谓菜鸟教程;但如果读者想全面学习Win...

    Pro-E三维转二维的一些设置.pdf

    - `PRO/Emenu_translatyesnopro/enno-yes-both` 可能指的是菜单的翻译设置,用户可以根据需要选择中文、英文或者是双语界面。 - `menu_fontARIAL`:指定菜单使用的字体为Arial,确保了软件界面的一致性和可读性。 ...

    Oracle Database Reference 10.2.pdf

    3. **自动管理功能**:引入了更多的自动化管理工具和技术,如自动存储管理(ASM)、自动任务调度等,减轻了数据库管理员的工作负担。 4. **可扩展性和高可用性**:支持多种集群配置,包括 Real Application Clusters...

    乐曲程序的设计与实现

    在提供的文件列表中,"huibian.doc"可能是关于ASM乐曲程序设计的一个指南或教程,可能详细介绍了如何编写和调试ASM代码以创建音乐程序。而"www.pudn.com.txt"可能是从一个编程讨论论坛或资源网站下载的资料,可能...

Global site tag (gtag.js) - Google Analytics