ONJava.com -- The Independent Source for Enterprise Java
oreilly.comSafari Books Online.Conferences.

advertisement

AddThis Social Bookmark Button

Introduction to the ASM 2.0 Bytecode Framework
Pages: 1, 2, 3, 4, 5, 6, 7, 8

Methods implementing the ClassVisitor interface, such as visit(), visitField(), visitMethod(), and visitAnnotation(), can collect information about dependencies on superclasses and interfaces, types used by fields, method parameters, return values, and exceptions, as well as types of the annotations. For example:

  public void visit(int version, int access, 
      String name, String signature, 
      String superName, String[] interfaces) {
    String p = getGroupKey(name);
    current = groups.get(p);
    if(current==null) {
      current = new HashMap<String,Integer>();
      groups.put(p, current);
    }
    
    if(signature==null) {
      addName(superName);
      addNames(interfaces);
    } else {
      addSignature(signature);
    }
  }

  public FieldVisitor visitField(int access, 
      String name, String desc, 
      String signature, Object value) {
    if(signature==null) {
      addDesc(desc);
    } else {
      addTypeSignature(signature);
    }
    if(value instanceof Type) {
      addType((Type) value);
    }
    return this;
  }
  
  public MethodVisitor visitMethod(int access, 
      String name, String desc, 
      String signature, String[] exceptions) {
    if(signature==null) {
      addMethodDesc(desc);
    } else {
      addSignature(signature);
    }
    addNames(exceptions);
    return this;
  }
  
  public AnnotationVisitor visitAnnotation(
      String desc, boolean visible) {
    addDesc(desc);
    return this;
  }

Methods implementing the MethodVisitor interface can collect dependencies on types of the parameter annotations and types used in bytecode instructions that can use object references:

  public AnnotationVisitor 
      visitParameterAnnotation(int parameter, 
          String desc, boolean visible) {
    addDesc(desc);
    return this;
  }

  /**
   * Visits a type instruction 
   * NEW, ANEWARRAY, CHECKCAST or INSTANCEOF.
   */
  public void visitTypeInsn(int opcode, 
        String desc) {
    if(desc.charAt(0)=='[') {
      addDesc(desc);
    } else {
      addName(desc);
    }
  }

  /**
   * Visits a field instruction 
   * GETSTATIC, PUTSTATIC, GETFIELD or PUTFIELD.
   */
  public void visitFieldInsn(int opcode, 
        String owner, String name, String desc) {
    addName(owner);
    addDesc(desc);
  }

  /**
   * Visits a method instruction INVOKEVIRTUAL, 
   * INVOKESPECIAL, INVOKESTATIC or 
   * INVOKEINTERFACE.
   */
  public void visitMethodInsn(int opcode, 
        String owner, String name, String desc) {
    addName(owner);
    addMethodDesc(desc);
  }

  /**
   * Visits a LDC instruction.
   */
  public void visitLdcInsn(Object cst) {
    if(cst instanceof Type) {
      addType((Type) cst);
    }
  }

  /**
   * Visits a MULTIANEWARRAY instruction.
   */
  public void visitMultiANewArrayInsn(
        String desc, int dims) {
    addDesc(desc);
  }

  /**
   * Visits a try catch block.
   */
  public void visitTryCatchBlock(Label start, 
        Label end, Label handler, String type) {
    addName(type);
  }


Pages: 1, 2, 3, 4, 5, 6, 7, 8

Next Pagearrow