예제 #1
0
  /* Class method reads one attribute from the input data stream.
   * This method must not be accessible from the outside.  It is
   * called by the Field and Method constructor methods.
   *
   * @see    Field
   * @see    Method
   * @param  file Input stream
   * @param  constant_pool Array of constants
   * @return Attribute
   * @throws  IOException
   * @throws  ClassFormatException
   */
  public static final Attribute readAttribute(DataInputStream file, ConstantPool constant_pool)
      throws IOException, ClassFormatException {
    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.");
    }
  }
예제 #2
0
 public String getName() {
   ConstantUtf8 c = (ConstantUtf8) constant_pool.getConstant(name_index, Constants.CONSTANT_Utf8);
   return c.getBytes();
 }
예제 #3
0
 /** @return Signature. */
 public final String getSignature() {
   ConstantUtf8 c;
   c = (ConstantUtf8) constant_pool.getConstant(signature_index, CONSTANT_Utf8);
   return c.getBytes();
 }
예제 #4
0
 /** Initialize from another object. */
 public ConstantUtf8(ConstantUtf8 c) {
   this(c.getBytes());
 }