ASM introduction

来自WHY42

Event based API vs Tree API

  • The event based API is faster and requires less memory than the object based API, since there is no need to create and store in memory a tree of objects representing the class (the same difference also exists between SAX and DOM).
  • However implementing class transformations can be more difficult with the event based API, since only one element of the class is available at any given time (the element that corresponds to the current event), while the whole class is available in memory with the object based API.

API structure

  • org.objectweb.asm
  • org.objectweb.asm.signature: packages define the event based API and provide the class parser and writer com- ponents. They are contained in the asm.jar archive.
  • org.objectweb.asm.util:provides various tools based on the core API that can be used during the development and debuging of ASM applications.
  • org.objectweb.asm.commons:provides several useful pre- defined class transformers, mostly based on the core API. It is contained in the asm-commons.jar archive.
  • org.objectweb.asm.tree:defines the object based API, and provides tools to convert between the event based and the object based representations.
  • org.objectweb.asm.tree.analysis:provides a class anal- ysis framework and several predefined class analyzers, based on the tree API. It is contained in the asm-analysis.jar archive.

Core API

public static ClassWriter createClassWriter(String name) {
    ClassWriter classWriter = new ClassWriter(0);
    classWriter.visit(V1_8,
            ACC_PUBLIC + ACC_FINAL,
            name,
            null,
            "java/lang/Object",
            null);
    return classWriter;
}

byte[] b = classWriter.toByteArray();

Tree API

public static ClassNode createClass(String name) {
    ClassNode classNode = new ClassNode();
    classNode.version = V1_8;
    classNode.access = ACC_PUBLIC + ACC_FINAL;
    classNode.name = name;
    classNode.superName = "java/lang/Object";
    return classNode;
}