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

ASM指南翻译-2

 
阅读更多

第一部分 核心API

2

这一章解释了如何使用ASM核心API来生成和转换编译后的java类。首先,结合一些说明性的例子,解释编译后的java类的相关结构,以及与之对应的ASM接口、组件和其他用于生成和转换的工具。关于方法,注解和泛型等内容,将在下一章节介绍。

2.1结构

2.1.1概述

一个编译后的java类的结构还是比较简单的。与被编译为本地代码的应用程序不同的是,编译后的java类保留了结构信息以及几乎所有的在源代码中定义的符号名称。事实上,编译后的java类包含以下几部分:

  • 一个用于描述修饰符(public或者private),类名,父类名称,所实现的接口名称以及类注解的段。
  • 一个用于描述类中字段信息的段。每个这样的段中都描述了字段的修饰符,名称,类型以及与该字段相关的注解。
  • 一个用于描述方法和构造方法的段。每个段描述了方法的名称,返回值,参数类型以及方法的注解。同时也包含了方法编译后的字节码序列。

然而,在源代码和编译后的代码之间,还是存在一些不同:

  • 一个编译后的java类仅仅只描述一个类信息,但是一个java源文件可以包含几个java类。例如,一个源文件可以定义一个包含内部类的java类,而编译后将会成为两个类文件,其中一个是主要的java类,另外一个是内部类。在主要的类中包含了指向内部类的引用,同时在主要的java类的方法中定义的内部类也会包含一个指向该java方法的引用。
  • 一个编译后的java类不包含注释,当然,可以包含与类、字段、方法或者代码相关的属性,而这些属性可以用来关联一些额外的信息。在java 5中引入了注解以后,这些注解也可以实现同样的目的,因此,这些属性就变得不那么重要了。
  • 一个编译后的java类不包含packageimport段,因此,在编译后的类中,所有的类型名称都必须使用全路径。

另外在结构上,两者还有一个非常重要的不同,那就是一个编译后的java类包含一个常量池段。这个常量池是一个数组,它包含了在类中定义的所有数字,字符串以及类型常量。这些常量只在常量池中定义一次,在类的其它地方都是通过它们的索引来引用。让人高兴的是,ASM隐藏了与常量池相关的细节,你就不必为此而烦恼了。图2.1总结了一个编译后的java类的整体结构。类的具体结构请参看java虚拟机规范第四段。


图表 2.编译后的java类整体结构(*表示0或者更多)

 

另外一个不同,就是java的类型在源代码和编译后的类中是不同的,下一部分将介绍它们的表现方式。

2.1.2内部名称

在很多情况下,一个类型限于一个java类或者结构表示的类型,例如,一个类的父类,一个类所实现的接口,一个方法所抛出的异常(不可能是基本类型)或者数组,这些都是类或者接口类型。这些类型在编译后的类中以内部名称表示。一个类的内部名称就是这个类的全路径名称,将包名中的点号替换为/。例如,String的内部名称为java/lang/String

2.1.3类型描述符

内部名称仅用作一个类或者接口的类型,所有其他的,如字段类型,java基本类型都是以类型描述符来表示的,见图2.2


2.2 类型描述符

 

基本类型的描述符:Z表示booleanC表示charB表示byteI表示intF表示floatJ表示longD表示double。一个类的描述符就是这个类的内部名称,在前面加上一个L,在后面加上一个分号即可。例如,String的类型描述符就是Ljava/lang/String.最后,一个数组的类型描述符就是一个中括号[后面跟上数组元素的类型描述符。

2.1.4方法描述符

一个方法描述符就是一个包含参数类型的描述符,以及方法返回类型描述符的字符串。一个方法描述符以一个左括号开始,然后跟上每个参数的描述符,然后是一个右括号,最后就是返回值的类型描述符,如果一个方法的返回值是void,那么返回值的类型描述符就是V(一个方法描述符不包含这个方法的名称以及参数的名称)。


2.3方法描述符示例

一旦你知道了类型描述符如何工作,那么理解方法描述符很容易。例如,(I)I描述了这样一个方法,它有一个int类型的参数,以及一个int返回值。图2.3给出了几个方法描述符的例子。

  • 大小: 36.3 KB
  • 大小: 32.4 KB
  • 大小: 57.2 KB
1
1
分享到:
评论

相关推荐

    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

    - `-gdwarf-2`:使用DWARF 2格式生成调试信息。 - `-O0`:不优化代码,方便调试。 - `-O1`:适度优化代码。 - `-O2`:进一步优化代码。 - `-O3`:最大化代码优化。 以上是GCC中文手册中提到的一些重要知识点。对于...

    c++实现的mips汇编器

    - `result1.coe`和`result2.asm`:可能分别是汇编后的结果和反汇编的结果文件。 - `HextoMIPS.coe`:可能包含十六进制表示的MIPS机器码,可能需要通过汇编器或反汇编器处理。 - `ConsoleApplication1.sln`:这是...

    AsmToE汇编机器码转换工具

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

    Linux 汇编语言开发指南

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

    Adminitrator's Reference 11gR2 for Unix-Based

    - **使用许可限制**:文档明确指出了使用、复制、翻译、广播、修改、许可、传输、分发、展示等内容的限制条件,并强调反向工程、拆卸或反编译行为(除非法律允许为了兼容性目的)是被禁止的。 通过阅读本书,Oracle...

    Oracle Database Reference 10.2.pdf

    2. **限制性使用**:根据许可证协议中的规定,用户不得擅自复制、翻译、广播、修改、授权、传输、分发、展示或表演软件的任何部分,除非许可证协议中有明确规定或许可,或者法律允许的情况。 3. **反向工程禁止**:...

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

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

    Windows 汇编语言编程指南

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

    乐曲程序的设计与实现

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

Global site tag (gtag.js) - Google Analytics