View Javadoc

    1   /*
    2    * Copyright  2000-2004 The Apache Software Foundation
    3    *
    4    *  Licensed under the Apache License, Version 2.0 (the "License");
    5    *  you may not use this file except in compliance with the License.
    6    *  You may obtain a copy of the License at
    7    *
    8    *      http://www.apache.org/licenses/LICENSE-2.0
    9    *
    10   *  Unless required by applicable law or agreed to in writing, software
    11   *  distributed under the License is distributed on an "AS IS" BASIS,
    12   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13   *  See the License for the specific language governing permissions and
    14   *  limitations under the License.
    15   *
    16   */
    17  package org.apache.bcel.classfile;
    18
    19  import java.io.DataInputStream;
    20  import java.io.DataOutputStream;
    21  import java.io.IOException;
    22  import org.apache.bcel.Constants;
    23
    24  /***
    25   * Abstract super class for fields and methods.
    26   *
    27   * @version $Id: FieldOrMethod.java 386056 2006-03-15 11:31:56Z tcurdt $
    28   * @author  <A HREF="mailto:m.dahm@gmx.de">M. Dahm</A>
    29   */
    30  public abstract class FieldOrMethod extends AccessFlags implements Cloneable, Node {
    31
    32      protected int name_index; // Points to field name in constant pool
    33      protected int signature_index; // Points to encoded signature
    34      protected int attributes_count; // No. of attributes
    35      protected Attribute[] attributes; // Collection of attributes
    36      protected ConstantPool constant_pool;
    37
    38
    39      FieldOrMethod() {
    40      }
    41
    42
    43      /***
    44       * Initialize from another object. Note that both objects use the same
    45       * references (shallow copy). Use clone() for a physical copy.
    46       */
    47      protected FieldOrMethod(FieldOrMethod c) {
    48          this(c.getAccessFlags(), c.getNameIndex(), c.getSignatureIndex(), c.getAttributes(), c
    49                  .getConstantPool());
    50      }
    51
    52
    53      /***
    54       * Construct object from file stream.
    55       * @param file Input stream
    56       * @throws IOException
    57       * @throws ClassFormatException
    58       */
    59      protected FieldOrMethod(DataInputStream file, ConstantPool constant_pool) throws IOException,
    60              ClassFormatException {
    61          this(file.readUnsignedShort(), file.readUnsignedShort(), file.readUnsignedShort(), null,
    62                  constant_pool);
    63          attributes_count = file.readUnsignedShort();
    64          attributes = new Attribute[attributes_count];
    65          for (int i = 0; i < attributes_count; i++) {
    66              attributes[i] = Attribute.readAttribute(file, constant_pool);
    67          }
    68      }
    69
    70
    71      /***
    72       * @param access_flags Access rights of method
    73       * @param name_index Points to field name in constant pool
    74       * @param signature_index Points to encoded signature
    75       * @param attributes Collection of attributes
    76       * @param constant_pool Array of constants
    77       */
    78      protected FieldOrMethod(int access_flags, int name_index, int signature_index,
    79              Attribute[] attributes, ConstantPool constant_pool) {
    80          this.access_flags = access_flags;
    81          this.name_index = name_index;
    82          this.signature_index = signature_index;
    83          this.constant_pool = constant_pool;
    84          setAttributes(attributes);
    85      }
    86
    87
    88      /***
    89       * Dump object to file stream on binary format.
    90       *
    91       * @param file Output file stream
    92       * @throws IOException
    93       */
    94      public final void dump( DataOutputStream file ) throws IOException {
    95          file.writeShort(access_flags);
    96          file.writeShort(name_index);
    97          file.writeShort(signature_index);
    98          file.writeShort(attributes_count);
    99          for (int i = 0; i < attributes_count; i++) {
    100             attributes[i].dump(file);
    101         }
    102     }
    103
    104
    105     /***
    106      * @return Collection of object attributes.
    107      */
    108     public final Attribute[] getAttributes() {
    109         return attributes;
    110     }
    111
    112
    113     /***
    114      * @param attributes Collection of object attributes.
    115      */
    116     public final void setAttributes( Attribute[] attributes ) {
    117         this.attributes = attributes;
    118         attributes_count = (attributes == null) ? 0 : attributes.length;
    119     }
    120
    121
    122     /***
    123      * @return Constant pool used by this object.
    124      */
    125     public final ConstantPool getConstantPool() {
    126         return constant_pool;
    127     }
    128
    129
    130     /***
    131      * @param constant_pool Constant pool to be used for this object.
    132      */
    133     public final void setConstantPool( ConstantPool constant_pool ) {
    134         this.constant_pool = constant_pool;
    135     }
    136
    137
    138     /***
    139      * @return Index in constant pool of object's name.
    140      */
    141     public final int getNameIndex() {
    142         return name_index;
    143     }
    144
    145
    146     /***
    147      * @param name_index Index in constant pool of object's name.
    148      */
    149     public final void setNameIndex( int name_index ) {
    150         this.name_index = name_index;
    151     }
    152
    153
    154     /***
    155      * @return Index in constant pool of field signature.
    156      */
    157     public final int getSignatureIndex() {
    158         return signature_index;
    159     }
    160
    161
    162     /***
    163      * @param signature_index Index in constant pool of field signature.
    164      */
    165     public final void setSignatureIndex( int signature_index ) {
    166         this.signature_index = signature_index;
    167     }
    168
    169
    170     /***
    171      * @return Name of object, i.e., method name or field name
    172      */
    173     public final String getName() {
    174         ConstantUtf8 c;
    175         c = (ConstantUtf8) constant_pool.getConstant(name_index, Constants.CONSTANT_Utf8);
    176         return c.getBytes();
    177     }
    178
    179
    180     /***
    181      * @return String representation of object's type signature (java style)
    182      */
    183     public final String getSignature() {
    184         ConstantUtf8 c;
    185         c = (ConstantUtf8) constant_pool.getConstant(signature_index, Constants.CONSTANT_Utf8);
    186         return c.getBytes();
    187     }
    188
    189
    190     /***
    191      * @return deep copy of this field
    192      */
    193     protected FieldOrMethod copy_( ConstantPool _constant_pool ) {
    194         try {
    195             FieldOrMethod c = (FieldOrMethod) clone();
    196             c.constant_pool = _constant_pool;
    197             c.attributes = new Attribute[attributes_count];
    198             for (int i = 0; i < attributes_count; i++) {
    199                 c.attributes[i] = attributes[i].copy(_constant_pool);
    200             }
    201             return c;
    202         } catch (CloneNotSupportedException e) {
    203             return null;
    204         }
    205     }
    206 }