前面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操作字节码,动态生成Java类class文件,模拟Spring的AOP实现原理。
NULL 博文链接:https://name327.iteye.com/blog/1554558
例如,可以使用ASM Tree API遍历一个类的整个字节码结构,查找并修改特定的指令或属性,或者在运行时动态生成新的类和方法。此外,由于ASM Tree API具有较高的抽象层次,因此它适用于各种类型的Java字节码操作,无论...
asm-tree 跟大家分享一下,赶快下载吧
asm-tree-5.0.3.jar
易语言asm取API地址源码,asm取API地址,asm_取api地址_调用api,Ox16,取变量地址_文本型_
标签:asm-tree-3.3.1.jar.zip,asm,tree,3.3.1,jar.zip包下载,依赖包
cglib动态代理模式jar包 cglib-2.2.jar asm-tree.jar asm-commons.jar asm.jar
asm-tree(3.0 /3.3) 不同版本, 资源共享,有需要其他jar包的可以在评论留言,看到后我会陆续上传。
赠送原API文档:asm-6.0-javadoc.jar 赠送源代码:asm-6.0-sources.jar 包含翻译后的API文档:asm-6.0-javadoc-API文档-中文(简体)-英语-对照版.zip 对应Maven信息:groupId:org.ow2.asm,artifactId:asm,...
包含翻译后的API文档:asm-all-5.0.2-javadoc-API文档-中文(简体)-英语-对照版.zip; Maven坐标:org.ow2.asm:asm-all:5.0.2; 标签:all、ow2、jar包、java、API文档、中英对照版; 使用方法:解压翻译后的API文档...
包含翻译后的API文档:asm-9.1-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.ow2.asm:asm:9.1; 标签:ow2、jar包、java、中文文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可...
收缩器将删除所有r.class和r\$**.class,所有常量整型字段将由asm和transform api内联。
标签:asm-tree-2.2.3.jar.zip,asm,tree,2.2.3,jar.zip包下载,依赖包
包含翻译后的API文档:asm-9.1-javadoc-API文档-中文(简体)-英语-对照版.zip; Maven坐标:org.ow2.asm:asm:9.1; 标签:ow2、jar包、java、中英对照文档; 使用方法:解压翻译后的API文档,用浏览器打开“index....
标签:asm-tree-3.2.jar.zip,asm,tree,3.2,jar.zip包下载,依赖包
this is a lib for java named : asm-tree-3.3.jar
标签:asm-tree-3.3.jar.zip,asm,tree,3.3,jar.zip包下载,依赖包
struts2.3开发依赖的asm包.不然有以下报错java.lang.NoClassDefFoundError: com/opensymphony/xwork2/util/finder/ClassFinder$InfoBuildingVisitor,导入asm-3.3.jar,asm-commons-3.3,asm-tree-3.3.jar即可
Java class 被存储在严格格式定义的 .class 文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性以及 Java 字节码(指令)。ASM 从类文件中读入信息后,能够改变类行为,分析类信息,甚至...