前面CoreApi的介绍部分基本涵盖了ASMCore包下面的主要API及功能,其中还有一部分关于MetaData的解析和生成就不再赘述。这篇开始介绍ASM另一部分主要的Api。TreeApi。这一部分源码是关联的asm-tree-5.0.4的版本。
在介绍前,先要知道一点, Tree工程的接口基本可以完成大部分我们之前介绍的Core中的功能。但是在实际使用中更加便利,当然也会更加消耗时间和性能。完成一个简单的生成编译后的Class字节码的任务,可能会花费多余Core的30%的时间,同时也会消耗更多内存。但是通过下面的介绍,相信在选择用哪种Api上,我们也会做出自己的取舍和判断。
一、生成编译后的Class
生成和转换一个编译后的Java类在TreeApi 中,主要借助ClassNode来完成。我们先一览一下ClassNode的一部分内容。
public class ClassNode extends ClassVisitor { public int version; public int access; public String name; public String signature; public String superName; public List<String> interfaces; public String sourceFile; public String sourceDebug; public String outerClass; public String outerMethod; public String outerMethodDesc; public List<AnnotationNode> visibleAnnotations; public List<AnnotationNode> invisibleAnnotations; public List<Attribute> attrs; public List<InnerClassNode> innerClasses; public List<FieldNode> fields; public List<MethodNode> methods; … }
同样,也有FieldNode 和MethodNode。这两个Api后续再详细介绍。可以看出ClassNode的这些公有成员可以让我们直接访问,可以通过初始化这些成员来生成编译后的Class,而不是像ClassVisitor那样,只能调用visit、visitField等方法来实现。下面简单看个例子,这个例子和之前我们那篇http://yunshen0909.iteye.com/blog/2219310 中一样,只是使用的API不同:
package asm.tree; import org.objectweb.asm.ClassWriter; import org.objectweb.asm.Opcodes; import org.objectweb.asm.tree.ClassNode; import org.objectweb.asm.tree.FieldNode; import org.objectweb.asm.tree.MethodNode; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; /** * Created by yunshen.ljy on 2015/7/12. */ public class GenerateClasses { public static void main(String[] args) throws FileNotFoundException { ClassWriter cw = new ClassWriter(Opcodes.ASM5); ClassNode cn = gen(); cn.accept(cw); File file = new File("ChildClass.class"); FileOutputStream fout = new FileOutputStream(file); try { fout.write(cw.toByteArray()); fout.close(); } catch (IOException e) { e.printStackTrace(); } } private static ClassNode gen() { ClassNode classNode = new ClassNode(); classNode.version = Opcodes.V1_8; classNode.access = Opcodes.ACC_PUBLIC + Opcodes.ACC_ABSTRACT; classNode.name = "asm/core/ChildClass"; classNode.superName = "java/lang/Object"; classNode.interfaces.add("asm/core/ParentInter"); classNode.fields.add(new FieldNode(Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL + Opcodes.ACC_STATIC, "zero", "I", null, new Integer(0))); classNode.methods.add(new MethodNode(Opcodes.ACC_PUBLIC + Opcodes.ACC_ABSTRACT, "compareTo", "(Ljava/lang/Object;)I", null, null)); return classNode; } }
上述例子,我们借助ClassWriter来输出字节数组是为了方便查看和对比生成的Class文件和我们之前用ClassVisitor是否达到同样的效果。ClassNode 的accept方法在第三部分展开介绍一下。同时,我们注意到,因为我们是可以直接访问类的共有变量的,所以也就不需要像ClassVisitor那样讲究调用顺序。用ClassNode 生成各个元素可以是无序访问,在一些情况确实是遍历,当然损失的就是性能。
相关推荐
《ASM Tree库3.2版本详解与应用》 ASM是一个Java字节码操控和分析框架,它可以直接解析和生成Java字节码...通过理解其核心概念、版本特性以及实践操作,开发者能够更好地利用ASM Tree来实现复杂的代码生成和分析任务。
ASM是一个Java字节码操控和分析框架,它可以直接解析和生成Java类文件,而ASM Tree库则是ASM框架的一部分,它提供了将字节码转换为抽象语法树(AST)的能力,进而便于进行代码分析和修改。本文将详细介绍ASM Tree ...
ASM Tree库是Java开发者在处理字节码操作时经常会用到的一个工具库,它作为ASM框架的一部分,为开发者提供了一种方便的方式来解析和构建抽象语法树(Abstract Syntax Tree, AST)。ASM是一个Java字节码操控和分析...
1. **代码生成与动态代理**:开发者可以利用ASM Tree库生成动态Java类,或者在运行时修改已有的类,实现动态代理、AOP等功能。 2. **代码分析与优化**:通过构建AST,可以对代码进行深度分析,找出性能瓶颈或者不...
总结一下,ASM Tree库2.2版是ASM框架的重要组成部分,它提供了一种高效的方式来处理和解析Java字节码,生成易于理解和操作的抽象语法树。无论是用于动态代码生成、运行时代理、代码分析还是其他高级编程任务,ASM ...
首先,ASM 提供了两种主要的 API:树API(Tree API)和访问者API(Visitor API)。树API允许开发者以近似 Java 语法的方式操作字节码,而访问者API则是一个事件驱动的模型,通过访问者对象遍历字节码结构。 在 "ASM...
在1.5.1版本中,ASM Tree库提供了丰富的API,如`ClassNode`、`MethodNode`和`FieldNode`等,这些类分别代表了Java类、方法和字段的AST节点。开发者可以通过这些类的实例,轻松地访问和修改类的结构。比如,我们可以...
1. **ASM Core**:这是ASM框架的基础,提供了解析和生成Java字节码的核心API。它包含了`ClassReader`和`ClassWriter`两个关键类,分别用于读取和写入类文件。`ClassReader`可以解析一个类的字节码,并触发用户自定义...
它旨在最小化运行时动态生成Class和转换对应用程序速度的影响,这得益于其高度优化的内部机制和精炼的代码库。这种设计思路使得ASM成为执行速度最快的Java字节码操作工具之一。 **2.3 开放的社区与许可** ASM3.0...
源代码部分是学习和理解ASM工作原理的关键,通过阅读源代码,开发者可以深入到ASM的内部机制,了解如何解析和生成字节码。ASM的源码通常包含多个模块,如core、tree、analysis、visit等,每个模块都有其特定的功能。...
《ASM Tree库1.5.2版本的深度解析与应用》 ASM Tree库,作为Java字节码操作框架ASM的一部分,是Java开发中一个至关重要的工具。ASM Tree库1.5.2版本的发布,为开发者提供了更稳定、更高效的字节码分析和操作能力。...
这个库通常会提供一系列类,如`ClassReader`用于读取类文件,`ClassWriter`用于生成类文件,以及`ClassAdapter`作为适配器模式的基础,允许自定义处理字节码的逻辑。还有其他类如`MethodVisitor`和`FieldVisitor`,...
- `org.objectweb.asm`和`org.objectweb.asm.signature`:包含基于事件模型的API,用于解析和生成类。 - `org.objectweb.asm.util`:提供调试工具,存在于asm-util.jar中。 - `org.objectweb.asm.commons`:包含...
ASM的核心API(Core API)和树API(Tree API)是其两大组成部分。 Core API是ASM的基础,主要包括以下几个核心类: 1. **ClassVisitor**:这是ASM的核心类,它定义了一个接口,用于访问类的元数据。当你需要遍历或...
5. **asm-tree**: 包含了用于构建和解析抽象语法树的类,这些树可以表示Java类的结构。 ASM的应用场景广泛,其中包括: - **动态代理**:生成代理类来拦截方法调用,实现AOP(面向切面编程)。 - **代码混淆**:...
3. **API设计**:ASM提供了一套简洁而强大的API,包括ClassWriter、ClassReader等核心类,使得开发者能够轻松地进行字节码操作。 4. **兼容性**:"4.0_RC1"版本是ASM的一个早期发布候选版本,通常会在正式版本发布...
常见的子类包括`ClassWriter`和`Tree API`中的`ClassNode`。`ClassWriter`可以直接将类信息转换为字节码,而`ClassNode`提供了更方便的树形结构,便于遍历和修改。 在`ClassVisitor`中,有两个重要的字段: 1. `api...
当我们使用ASM Tree API解析这段代码时,会遇到以下关键类: - `ClassNode` 代表Java类的抽象语法树节点,包含了类的完整信息,如类名、包名、文件版本等。通过 `ClassNode`,我们可以访问到类的属性,例如 `class...
ASM框架使用“Tree”来表示复杂的字节码结构,利用Push模型进行遍历,并对字节码进行修改。同时,它采用“Visitor”模式来遍历整个二进制结构。这种事件驱动的处理方式使得开发者只需关注对其编程有意义的部分,而不...
ASM是一个开源的Java字节码操纵框架,它可以直接生成和解析.class文件,提供了一套低级别的API来访问和修改类的结构。ASM的核心在于其能够将类的结构表示为一棵抽象语法树(Abstract Syntax Tree,AST),开发者可以...