FileDocCategorySizeDatePackage
Attribute.javaAPI DocJava SE 6 API10120Tue Jun 10 00:22:16 BST 2008com.sun.org.apache.bcel.internal.classfile

Attribute

public abstract class Attribute extends Object implements Serializable, Node, Cloneable
Abstract super class for Attribute objects. Currently the ConstantValue, SourceFile, Code, Exceptiontable, LineNumberTable, LocalVariableTable, InnerClasses and Synthetic attributes are supported. The Unknown attribute stands for non-standard-attributes.
version
$Id: Attribute.java,v 1.1.2.1 2005/07/31 23:46:25 jeffsuttor Exp $
author
M. Dahm
see
ConstantValue
see
SourceFile
see
Code
see
Unknown
see
ExceptionTable
see
LineNumberTable
see
LocalVariableTable
see
InnerClasses
see
Synthetic
see
Deprecated
see
Signature

Fields Summary
protected int
name_index
protected int
length
protected byte
tag
protected ConstantPool
constant_pool
private static HashMap
readers
Constructors Summary
protected Attribute(byte tag, int name_index, int length, ConstantPool constant_pool)

    this.tag           = tag;
    this.name_index    = name_index;
    this.length        = length;
    this.constant_pool = constant_pool;
  
Methods Summary
public abstract voidaccept(com.sun.org.apache.bcel.internal.classfile.Visitor v)
Called by objects that are traversing the nodes of the tree implicitely defined by the contents of a Java class. I.e., the hierarchy of methods, fields, attributes, etc. spawns a tree of objects.

param
v Visitor object

public static voidaddAttributeReader(java.lang.String name, com.sun.org.apache.bcel.internal.classfile.AttributeReader r)
Add an Attribute reader capable of parsing (user-defined) attributes named "name". You should not add readers for the standard attributes such as "LineNumberTable", because those are handled internally.

param
name the name of the attribute as stored in the class file
param
r the reader object


                                                    
         
    readers.put(name, r);
  
public java.lang.Objectclone()
Use copy() if you want to have a deep copy(), i.e., with all references copied correctly.

return
shallow copy of this attribute

    Object o = null;

    try {
      o = super.clone();
    } catch(CloneNotSupportedException e) {
      e.printStackTrace(); // Never occurs
    }

    return o;
  
public abstract com.sun.org.apache.bcel.internal.classfile.Attributecopy(com.sun.org.apache.bcel.internal.classfile.ConstantPool constant_pool)

return
deep copy of this attribute

public voiddump(java.io.DataOutputStream file)
Dump attribute to file stream in binary format.

param
file Output file stream
throws
IOException

    file.writeShort(name_index);
    file.writeInt(length);
  
public final com.sun.org.apache.bcel.internal.classfile.ConstantPoolgetConstantPool()

return
Constant pool used by this object.
see
ConstantPool

 return constant_pool; 
public final intgetLength()

return
Length of attribute field in bytes.

 return length; 
public final intgetNameIndex()

return
Name index in constant pool of attribute name.

 return name_index; 
public final bytegetTag()

return
Tag of attribute, i.e., its type. Value may not be altered, thus there is no setTag() method.

 return tag; 
public static final com.sun.org.apache.bcel.internal.classfile.AttributereadAttribute(java.io.DataInputStream file, com.sun.org.apache.bcel.internal.classfile.ConstantPool constant_pool)

    ConstantUtf8 c;
    String       name;
    int          name_index;
    int          length;
    byte         tag = Constants.ATTR_UNKNOWN; // Unknown attribute

    // Get class name from constant pool via `name_index' indirection
    name_index = (int)file.readUnsignedShort();
    c          = (ConstantUtf8)constant_pool.getConstant(name_index, 
							 Constants.CONSTANT_Utf8);
    name       = c.getBytes();

    // Length of data in bytes
    length = file.readInt();

    // Compare strings to find known attribute
    for(byte i=0; i < Constants.KNOWN_ATTRIBUTES; i++) {
      if(name.equals(Constants.ATTRIBUTE_NAMES[i])) {
	tag = i; // found!
	break;
      }
    }

    // Call proper constructor, depending on `tag'
    switch(tag) {
    case Constants.ATTR_UNKNOWN:
      AttributeReader r = (AttributeReader)readers.get(name);

      if(r != null)
	return r.createAttribute(name_index, length, file, constant_pool);
      else
	return new Unknown(name_index, length, file, constant_pool);

    case Constants.ATTR_CONSTANT_VALUE:
      return new ConstantValue(name_index, length, file, constant_pool);

    case Constants.ATTR_SOURCE_FILE:
      return new SourceFile(name_index, length, file, constant_pool);
	  
    case Constants.ATTR_CODE:
      return new Code(name_index, length, file, constant_pool);
	  
    case Constants.ATTR_EXCEPTIONS:
      return new ExceptionTable(name_index, length, file, constant_pool);
	  
    case Constants.ATTR_LINE_NUMBER_TABLE:
      return new LineNumberTable(name_index, length, file, constant_pool);
	  
    case Constants.ATTR_LOCAL_VARIABLE_TABLE:
      return new LocalVariableTable(name_index, length, file, constant_pool);

    case Constants.ATTR_INNER_CLASSES:
      return new InnerClasses(name_index, length, file, constant_pool);

    case Constants.ATTR_SYNTHETIC:
      return new Synthetic(name_index, length, file, constant_pool);

    case Constants.ATTR_DEPRECATED:
      return new Deprecated(name_index, length, file, constant_pool);

    case Constants.ATTR_PMG:
      return new PMGClass(name_index, length, file, constant_pool);

    case Constants.ATTR_SIGNATURE:
      return new Signature(name_index, length, file, constant_pool);

    case Constants.ATTR_STACK_MAP:
      return new StackMap(name_index, length, file, constant_pool);

    default: // Never reached
      throw new IllegalStateException("Ooops! default case reached.");
    }
  
public static voidremoveAttributeReader(java.lang.String name)
Remove attribute reader

param
name the name of the attribute as stored in the class file

    readers.remove(name);
  
public final voidsetConstantPool(com.sun.org.apache.bcel.internal.classfile.ConstantPool constant_pool)

param
constant_pool Constant pool to be used for this object.
see
ConstantPool

    this.constant_pool = constant_pool;
  
public final voidsetLength(int length)

param
Attribute length in bytes.

    this.length = length;
  
public final voidsetNameIndex(int name_index)

param
name_index of attribute.

    this.name_index = name_index;
  
public java.lang.StringtoString()

return
attribute name.

    return Constants.ATTRIBUTE_NAMES[tag];