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  * @version $Id: ConstantNameAndType.java 1747278 2016-06-07 17:28:43Z britter $
36  * @see     Constant
37  */
38 public final class ConstantNameAndType extends Constant {
39 
40     private int name_index; // Name of field/method
41     private int signature_index; // and its signature.
42 
43 
44     /**
45      * Initialize from another object.
46      */
ConstantNameAndType(final ConstantNameAndType c)47     public ConstantNameAndType(final ConstantNameAndType c) {
48         this(c.getNameIndex(), c.getSignatureIndex());
49     }
50 
51 
52     /**
53      * Initialize instance from file data.
54      *
55      * @param file Input stream
56      * @throws IOException
57      */
ConstantNameAndType(final DataInput file)58     ConstantNameAndType(final DataInput file) throws IOException {
59         this(file.readUnsignedShort(), file.readUnsignedShort());
60     }
61 
62 
63     /**
64      * @param name_index Name of field/method
65      * @param signature_index and its signature
66      */
ConstantNameAndType(final int name_index, final int signature_index)67     public ConstantNameAndType(final int name_index, final int signature_index) {
68         super(Const.CONSTANT_NameAndType);
69         this.name_index = name_index;
70         this.signature_index = signature_index;
71     }
72 
73 
74     /**
75      * Called by objects that are traversing the nodes of the tree implicitely
76      * defined by the contents of a Java class. I.e., the hierarchy of methods,
77      * fields, attributes, etc. spawns a tree of objects.
78      *
79      * @param v Visitor object
80      */
81     @Override
accept( final Visitor v )82     public void accept( final Visitor v ) {
83         v.visitConstantNameAndType(this);
84     }
85 
86 
87     /**
88      * Dump name and signature index to file stream in binary format.
89      *
90      * @param file Output file stream
91      * @throws IOException
92      */
93     @Override
dump( final DataOutputStream file )94     public final void dump( final DataOutputStream file ) throws IOException {
95         file.writeByte(super.getTag());
96         file.writeShort(name_index);
97         file.writeShort(signature_index);
98     }
99 
100 
101     /**
102      * @return Name index in constant pool of field/method name.
103      */
getNameIndex()104     public final int getNameIndex() {
105         return name_index;
106     }
107 
108 
109     /** @return name
110      */
getName( final ConstantPool cp )111     public final String getName( final ConstantPool cp ) {
112         return cp.constantToString(getNameIndex(), Const.CONSTANT_Utf8);
113     }
114 
115 
116     /**
117      * @return Index in constant pool of field/method signature.
118      */
getSignatureIndex()119     public final int getSignatureIndex() {
120         return signature_index;
121     }
122 
123 
124     /** @return signature
125      */
getSignature( final ConstantPool cp )126     public final String getSignature( final ConstantPool cp ) {
127         return cp.constantToString(getSignatureIndex(), Const.CONSTANT_Utf8);
128     }
129 
130 
131     /**
132      * @param name_index the name index of this constant
133      */
setNameIndex( final int name_index )134     public final void setNameIndex( final int name_index ) {
135         this.name_index = name_index;
136     }
137 
138 
139     /**
140      * @param signature_index the signature index in the constant pool of this type
141      */
setSignatureIndex( final int signature_index )142     public final void setSignatureIndex( final int signature_index ) {
143         this.signature_index = signature_index;
144     }
145 
146 
147     /**
148      * @return String representation
149      */
150     @Override
toString()151     public final String toString() {
152         return super.toString() + "(name_index = " + name_index + ", signature_index = "
153                 + signature_index + ")";
154     }
155 }
156