当前位置:首页 > 开发 > 编程语言 > 编程 > 正文

ASM系列五 利用TreeApi 解析生成Class

发表于: 2015-07-12   作者:lijingyao8206   来源:转载   浏览:
摘要:    前面CoreApi的介绍部分基本涵盖了ASMCore包下面的主要API及功能,其中还有一部分关于MetaData的解析和生成就不再赘述。这篇开始介绍ASM另一部分主要的Api。TreeApi。这一部分源码是关联的asm-tree-5.0.4的版本。          在介绍前,先要知道一点, Tree工程的接口基本可以完

   前面CoreApi的介绍部分基本涵盖了ASMCore包下面的主要API及功能,其中还有一部分关于MetaData的解析和生成就不再赘述。这篇开始介绍ASM另一部分主要的ApiTreeApi。这一部分源码是关联的asm-tree-5.0.4的版本。

         在介绍前,先要知道一点, Tree工程的接口基本可以完成大部分我们之前介绍的Core中的功能。但是在实际使用中更加便利,当然也会更加消耗时间和性能。完成一个简单的生成编译后的Class字节码的任务,可能会花费多余Core30%的时间,同时也会消耗更多内存。但是通过下面的介绍,相信在选择用哪种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那样,只能调用visitvisitField等方法来实现。下面简单看个例子,这个例子和之前我们那篇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系列五 利用TreeApi 解析生成Class

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
一、概述    ASM的CoreApi 中还提供了对class 中方法的生成和解析的组件。前面两篇着重介绍了Clas
一、概述    ASM的CoreApi 中还提供了对class 中方法的生成和解析的组件。前面两篇着重介绍了Clas
一、概述    ASM的CoreApi 中还提供了对class 中方法的生成和解析的组件。前面两篇着重介绍了Clas
概述 本专栏前面的文章,主要详细讲解了Class文件的格式,并且在上一篇文章中做了总结。 众所周知,
通常我们用到的信号都是实值信号,但是我们可以根据这个实信号构造出一个复信号,使得这个复信号只
作为一个程序员,仅仅知道怎么用是远远不够的。起码,你需要知道为什么可以这么用,即我们所谓底层
之前一篇简单介绍了一下ASM框架。这一篇继续对CoreApi进行扩展。这里还是继续对ClassWriter ,Class
之前一篇简单介绍了一下ASM框架。这一篇继续对CoreApi进行扩展。这里还是继续对ClassWriter ,Class
之前一篇简单介绍了一下ASM框架。这一篇继续对CoreApi进行扩展。这里还是继续对ClassWriter ,Class
利用 SMS 批量部署操作系统 杜 飞 SMS2003中有一个操作系统部署功能(Operating System Deployment)
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号