本章介绍如何使用ASM树API生成和转换类。
它从仅介绍tree API入手,然后进行说明如何与核心API组合在一起。
在下一章中将说明用于方法,注解和泛型内容的树形API。
Interfaces and components
Presentation(介绍)
类节点信息
用于生成和转换已编译Java类的ASM树API基于ClassNode类(请参见图6.1)。
- Figure 6.1.: The ClassNode class (only fields are shown)
本章介绍如何使用ASM树API生成和转换类。
它从仅介绍tree API入手,然后进行说明如何与核心API组合在一起。
在下一章中将说明用于方法,注解和泛型内容的树形API。
用于生成和转换已编译Java类的ASM树API基于ClassNode类(请参见图6.1)。
到目前为止,我们只看到了如何创建和转换ClassNode对象,但是还没有看到如何从类的字节数组表示形式构造ClassNode,反之亦然,如何从ClassNode构造此字节数组。
实际上,这是通过组合核心API和树API组件来完成的,如本节所述。
除了图6.1中所示的字段之外,ClassNode类还扩展了ClassVisitor类,并且还提供了一个接受方法,该方法将ClassVisitor作为参数。
accept方法根据ClassNode字段值生成事件,而ClassVisitor方法执行相反的操作,即根据接收到的事件设置ClassNode字段:
本章介绍如何使用ASM树API生成和转换方法。
它从仅提供树API的介绍开始,并提供一些说明性示例,然后介绍如何与核心API组合。
下一章介绍了用于泛型和注解的树形API。
用于生成和转换方法的ASM树API基于MethodNode类(请参见图7.1)。
public class MethodNode ... {
public int access;
public String name;
public String desc;
public String signature;
public List exceptions;
public List visibleAnnotations;
public List invisibleAnnotations;
public List attrs;
public Object annotationDefault;
public List[] visibleParameterAnnotations;
public List[] invisibleParameterAnnotations;
public InsnList instructions;
public List tryCatchBlocks;
public List localVariables;
public int maxStack;
public int maxLocals;
}
到目前为止,我们只看到了如何创建和转换MethodNode对象,但是还没有看到与类的字节数组表示形式相关的链接。
像对于类一样,此链接是通过组合核心API和树API组件来完成的,如本节所述。
除了图7.1中所示的字段外,MethodNode类还扩展了MethodVisitor类,并且还提供了两个接受方法,它们将MethodVisitor或ClassVisitor作为参数。
accept方法根据MethodNode字段值生成事件,而MethodVisitor方法执行相反的操作,即根据接收到的事件设置MethodNode字段。
本章介绍基于树API的ASM API,用于分析方法代码。
首先介绍代码分析算法,然后提供相应的ASM API和一些示例。
代码分析是一个非常大的主题,并且存在许多用于分析代码的算法。
在这里不可能全部展示它们,这超出了本文的范围。
实际上,本部分的目的只是概述ASM中使用的算法。
在有关编译器的书中可以找到关于此主题的更好的介绍。
下一节将介绍两种重要的代码分析技术,即数据流和控制流分析:
数据流分析包括针对该方法的每个指令计算方法的执行框架的状态。
该状态可以以或多或少的抽象方式表示。
用于代码分析的ASM API在 org.objectweb.asm.tree.analysis 软件包中。
就像包名称所暗示的那样,它基于树API。
实际上,该程序包提供了进行正向数据流分析的框架。
为了能够使用或多或少的精确值集执行各种数据流分析,数据流分析算法分为两部分:
一个是固定的,由框架提供,另一个是可变的,由用户提供。
更确切地说:
在Analyzer和Frame类中,一劳永逸地实现了整个数据流分析算法,以及从堆栈弹出并推回堆栈的任务,并使用了适当数量的值。
组合值和计算值集并集的任务由解释器和值抽象类的用户定义子类执行。
本章介绍了用于已编译Java类元数据(例如注解)的树API。
之所以很短,是因为这些元数据已经在第4章中介绍过,并且因为一旦知道了相应的 core API,树API就很简单。
树API不提供对泛型类型的任何支持!
确实,它代表了带有签名的泛型类型,就像在核心API中一样,但是没有提供与SignatureVisitor对应的SignatureNode类,尽管这是可能的(实际上,使用多个Node类来区分类型,方法和类会很方便。 签名)。
用于注解的树形API基于AnnotationNode类,其公共API如下:
与核心API一样,ASM 4.0的树API中也引入了一种新机制,以确保在将来的ASM版本中向后兼容。
但是,这里再次不能单独通过ASM来确保此属性。
要求用户在编写自己的文章时遵循一些简单的准则
码。
本章的目的是介绍这些准则,并给出ASM树API中使用的内部机制的概念,以确保向后兼容。
本节介绍了使用ASM树API时必须遵循的准则,以确保您的代码在以后的任何ASM版本中保持有效(按照5.1.1节中定义的约定)。
首先,如果您使用树API编写类生成器,则没有遵循的指南(与核心API一样)。