View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   *  Unless required by applicable law or agreed to in writing, software
12   *  distributed under the License is distributed on an "AS IS" BASIS,
13   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   *  See the License for the specific language governing permissions and
15   *  limitations under the License.
16   *
17   */
18  package org.apache.bcel.classfile;
19  
20  import java.io.DataInput;
21  import java.io.DataOutputStream;
22  import java.io.IOException;
23  
24  import org.apache.bcel.Const;
25  
26  /**
27   * Abstract super class for Fieldref, Methodref, InterfaceMethodref and
28   *                          InvokeDynamic constants.
29   *
30   * @version $Id: ConstantCP.html 1018313 2017-09-18 09:03:04Z britter $
31   * @see     ConstantFieldref
32   * @see     ConstantMethodref
33   * @see     ConstantInterfaceMethodref
34   * @see     ConstantInvokeDynamic
35   */
36  public abstract class ConstantCP extends Constant {
37  
38      /** References to the constants containing the class and the field signature
39       */
40      // Note that this field is used to store the
41      // bootstrap_method_attr_index of a ConstantInvokeDynamic.
42      /**
43       * @deprecated (since 6.0) will be made private; do not access directly, use getter/setter
44       */
45      @java.lang.Deprecated
46      protected int class_index; // TODO make private (has getter & setter)
47      // This field has the same meaning for all subclasses.
48  
49      /**
50       * @deprecated (since 6.0) will be made private; do not access directly, use getter/setter
51       */
52      @java.lang.Deprecated
53      protected int name_and_type_index; // TODO make private (has getter & setter)
54  
55  
56      /**
57       * Initialize from another object.
58       */
59      public ConstantCP(final ConstantCP c) {
60          this(c.getTag(), c.getClassIndex(), c.getNameAndTypeIndex());
61      }
62  
63  
64      /**
65       * Initialize instance from file data.
66       *
67       * @param tag  Constant type tag
68       * @param file Input stream
69       * @throws IOException
70       */
71      ConstantCP(final byte tag, final DataInput file) throws IOException {
72          this(tag, file.readUnsignedShort(), file.readUnsignedShort());
73      }
74  
75  
76      /**
77       * @param class_index Reference to the class containing the field
78       * @param name_and_type_index and the field signature
79       */
80      protected ConstantCP(final byte tag, final int class_index, final int name_and_type_index) {
81          super(tag);
82          this.class_index = class_index;
83          this.name_and_type_index = name_and_type_index;
84      }
85  
86  
87      /**
88       * Dump constant field reference to file stream in binary format.
89       *
90       * @param file Output file stream
91       * @throws IOException
92       */
93      @Override
94      public final void dump( final DataOutputStream file ) throws IOException {
95          file.writeByte(super.getTag());
96          file.writeShort(class_index);
97          file.writeShort(name_and_type_index);
98      }
99  
100 
101     /**
102      * @return Reference (index) to class this constant refers to.
103      */
104     public final int getClassIndex() {
105         return class_index;
106     }
107 
108 
109     /**
110      * @param class_index points to Constant_class
111      */
112     public final void setClassIndex( final int class_index ) {
113         this.class_index = class_index;
114     }
115 
116 
117     /**
118      * @return Reference (index) to signature of the field.
119      */
120     public final int getNameAndTypeIndex() {
121         return name_and_type_index;
122     }
123 
124 
125     /**
126      * @param name_and_type_index points to Constant_NameAndType
127      */
128     public final void setNameAndTypeIndex( final int name_and_type_index ) {
129         this.name_and_type_index = name_and_type_index;
130     }
131 
132 
133     /**
134      * @return Class this field belongs to.
135      */
136     public String getClass( final ConstantPool cp ) {
137         return cp.constantToString(class_index, Const.CONSTANT_Class);
138     }
139 
140 
141     /**
142      * @return String representation.
143      *
144      * not final as ConstantInvokeDynamic needs to modify
145      */
146     @Override
147     public String toString() {
148         return super.toString() + "(class_index = " + class_index + ", name_and_type_index = "
149                 + name_and_type_index + ")";
150     }
151 }