ConstantNameAndType.java

  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. package org.apache.bcel.classfile;

  18. import java.io.DataInput;
  19. import java.io.DataOutputStream;
  20. import java.io.IOException;

  21. import org.apache.bcel.Const;

  22. /**
  23.  * This class is derived from the abstract {@link Constant} and represents a reference to the name and signature of a
  24.  * field or method.
  25.  *
  26.  * @see Constant
  27.  */
  28. public final class ConstantNameAndType extends Constant {

  29.     private int nameIndex; // Name of field/method
  30.     private int signatureIndex; // and its signature.

  31.     /**
  32.      * Initialize from another object.
  33.      *
  34.      * @param c Source to copy.
  35.      */
  36.     public ConstantNameAndType(final ConstantNameAndType c) {
  37.         this(c.getNameIndex(), c.getSignatureIndex());
  38.     }

  39.     /**
  40.      * Initialize instance from file data.
  41.      *
  42.      * @param file Input stream
  43.      * @throws IOException if an I/O error occurs.
  44.      */
  45.     ConstantNameAndType(final DataInput file) throws IOException {
  46.         this(file.readUnsignedShort(), file.readUnsignedShort());
  47.     }

  48.     /**
  49.      * @param nameIndex Name of field/method
  50.      * @param signatureIndex and its signature
  51.      */
  52.     public ConstantNameAndType(final int nameIndex, final int signatureIndex) {
  53.         super(Const.CONSTANT_NameAndType);
  54.         this.nameIndex = nameIndex;
  55.         this.signatureIndex = signatureIndex;
  56.     }

  57.     /**
  58.      * Called by objects that are traversing the nodes of the tree implicitly defined by the contents of a Java class.
  59.      * I.e., the hierarchy of methods, fields, attributes, etc. spawns a tree of objects.
  60.      *
  61.      * @param v Visitor object
  62.      */
  63.     @Override
  64.     public void accept(final Visitor v) {
  65.         v.visitConstantNameAndType(this);
  66.     }

  67.     /**
  68.      * Dump name and signature index to file stream in binary format.
  69.      *
  70.      * @param file Output file stream
  71.      * @throws IOException if an I/O error occurs.
  72.      */
  73.     @Override
  74.     public void dump(final DataOutputStream file) throws IOException {
  75.         file.writeByte(super.getTag());
  76.         file.writeShort(nameIndex);
  77.         file.writeShort(signatureIndex);
  78.     }

  79.     /**
  80.      * @return name
  81.      */
  82.     public String getName(final ConstantPool cp) {
  83.         return cp.constantToString(getNameIndex(), Const.CONSTANT_Utf8);
  84.     }

  85.     /**
  86.      * @return Name index in constant pool of field/method name.
  87.      */
  88.     public int getNameIndex() {
  89.         return nameIndex;
  90.     }

  91.     /**
  92.      * @return signature
  93.      */
  94.     public String getSignature(final ConstantPool cp) {
  95.         return cp.constantToString(getSignatureIndex(), Const.CONSTANT_Utf8);
  96.     }

  97.     /**
  98.      * @return Index in constant pool of field/method signature.
  99.      */
  100.     public int getSignatureIndex() {
  101.         return signatureIndex;
  102.     }

  103.     /**
  104.      * @param nameIndex the name index of this constant
  105.      */
  106.     public void setNameIndex(final int nameIndex) {
  107.         this.nameIndex = nameIndex;
  108.     }

  109.     /**
  110.      * @param signatureIndex the signature index in the constant pool of this type
  111.      */
  112.     public void setSignatureIndex(final int signatureIndex) {
  113.         this.signatureIndex = signatureIndex;
  114.     }

  115.     /**
  116.      * @return String representation
  117.      */
  118.     @Override
  119.     public String toString() {
  120.         return super.toString() + "(nameIndex = " + nameIndex + ", signatureIndex = " + signatureIndex + ")";
  121.     }
  122. }