1 /*
2  * reserved comment block
3  * DO NOT REMOVE OR ALTER!
4  */
5 /*
6  * Licensed to the Apache Software Foundation (ASF) under one or more
7  * contributor license agreements.  See the NOTICE file distributed with
8  * this work for additional information regarding copyright ownership.
9  * The ASF licenses this file to You under the Apache License, Version 2.0
10  * (the "License"); you may not use this file except in compliance with
11  * the License.  You may obtain a copy of the License at
12  *
13  *      http://www.apache.org/licenses/LICENSE-2.0
14  *
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  */
21 
22 package com.sun.org.apache.bcel.internal.classfile;
23 
24 import java.io.DataInput;
25 import java.io.DataOutputStream;
26 import java.io.IOException;
27 
28 import com.sun.org.apache.bcel.internal.Const;
29 
30 /**
31  * This class is derived from the abstract {@link Constant}
32  * and represents a reference to the name and signature
33  * of a field or method.
34  *
35  * @see     Constant
36  */
37 public final class ConstantNameAndType extends Constant {
38 
39     private int name_index; // Name of field/method
40     private int signature_index; // and its signature.
41 
42 
43     /**
44      * Initialize from another object.
45      */
ConstantNameAndType(final ConstantNameAndType c)46     public ConstantNameAndType(final ConstantNameAndType c) {
47         this(c.getNameIndex(), c.getSignatureIndex());
48     }
49 
50 
51     /**
52      * Initialize instance from file data.
53      *
54      * @param file Input stream
55      * @throws IOException
56      */
ConstantNameAndType(final DataInput file)57     ConstantNameAndType(final DataInput file) throws IOException {
58         this(file.readUnsignedShort(), file.readUnsignedShort());
59     }
60 
61 
62     /**
63      * @param name_index Name of field/method
64      * @param signature_index and its signature
65      */
ConstantNameAndType(final int name_index, final int signature_index)66     public ConstantNameAndType(final int name_index, final int signature_index) {
67         super(Const.CONSTANT_NameAndType);
68         this.name_index = name_index;
69         this.signature_index = signature_index;
70     }
71 
72 
73     /**
74      * Called by objects that are traversing the nodes of the tree implicitely
75      * defined by the contents of a Java class. I.e., the hierarchy of methods,
76      * fields, attributes, etc. spawns a tree of objects.
77      *
78      * @param v Visitor object
79      */
80     @Override
accept( final Visitor v )81     public void accept( final Visitor v ) {
82         v.visitConstantNameAndType(this);
83     }
84 
85 
86     /**
87      * Dump name and signature index to file stream in binary format.
88      *
89      * @param file Output file stream
90      * @throws IOException
91      */
92     @Override
dump( final DataOutputStream file )93     public void dump( final DataOutputStream file ) throws IOException {
94         file.writeByte(super.getTag());
95         file.writeShort(name_index);
96         file.writeShort(signature_index);
97     }
98 
99 
100     /**
101      * @return Name index in constant pool of field/method name.
102      */
getNameIndex()103     public int getNameIndex() {
104         return name_index;
105     }
106 
107 
108     /** @return name
109      */
getName( final ConstantPool cp )110     public String getName( final ConstantPool cp ) {
111         return cp.constantToString(getNameIndex(), Const.CONSTANT_Utf8);
112     }
113 
114 
115     /**
116      * @return Index in constant pool of field/method signature.
117      */
getSignatureIndex()118     public int getSignatureIndex() {
119         return signature_index;
120     }
121 
122 
123     /** @return signature
124      */
getSignature( final ConstantPool cp )125     public String getSignature( final ConstantPool cp ) {
126         return cp.constantToString(getSignatureIndex(), Const.CONSTANT_Utf8);
127     }
128 
129 
130     /**
131      * @param name_index the name index of this constant
132      */
setNameIndex( final int name_index )133     public void setNameIndex( final int name_index ) {
134         this.name_index = name_index;
135     }
136 
137 
138     /**
139      * @param signature_index the signature index in the constant pool of this type
140      */
setSignatureIndex( final int signature_index )141     public void setSignatureIndex( final int signature_index ) {
142         this.signature_index = signature_index;
143     }
144 
145 
146     /**
147      * @return String representation
148      */
149     @Override
toString()150     public String toString() {
151         return super.toString() + "(name_index = " + name_index + ", signature_index = "
152                 + signature_index + ")";
153     }
154 }
155