    001/*
    002 * Licensed to the Apache Software Foundation (ASF) under one
    003 * or more contributor license agreements.  See the NOTICE file
    004 * distributed with this work for additional information
    005 * regarding copyright ownership.  The ASF licenses this file
    006 * to you under the Apache License, Version 2.0 (the
    007 * "License"); you may not use this file except in compliance
    008 * with the License.  You may obtain a copy of the License at
    009 *
    010 *   https://www.apache.org/licenses/LICENSE-2.0
    011 *
    012 * Unless required by applicable law or agreed to in writing,
    013 * software distributed under the License is distributed on an
    014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    015 * KIND, either express or implied.  See the License for the
    016 * specific language governing permissions and limitations
    017 * under the License.
    018 */
    019package org.apache.bcel.classfile;
    020
    021import java.io.DataInput;
    022import java.io.DataOutputStream;
    023import java.io.IOException;
    024
    025import org.apache.bcel.Const;
    026
    027/**
    028 * Abstract super class for Fieldref, Methodref, InterfaceMethodref and InvokeDynamic constants.
    029 *
    030 * @see ConstantFieldref
    031 * @see ConstantMethodref
    032 * @see ConstantInterfaceMethodref
    033 * @see ConstantInvokeDynamic
    034 */
    035public abstract class ConstantCP extends Constant {
    036
    037    /**
    038     * References to the constants containing the class and the field signature
    039     */
    040    // Note that this field is used to store the
    041    // bootstrap_method_attr_index of a ConstantInvokeDynamic.
    042
    043    /**
    044     * @deprecated (since 6.0) will be made private; do not access directly, use getter/setter.
    045     */
    046    @java.lang.Deprecated
    047    protected int class_index; // TODO make private (has getter & setter)
    048    // This field has the same meaning for all subclasses.
    049
    050    /**
    051     * @deprecated (since 6.0) will be made private; do not access directly, use getter/setter.
    052     */
    053    @java.lang.Deprecated
    054    protected int name_and_type_index; // TODO make private (has getter & setter)
    055
    056    /**
    057     * Initialize instance from file data.
    058     *
    059     * @param tag Constant type tag.
    060     * @param file Input stream.
    061     * @throws IOException if an I/O error occurs.
    062     */
    063    ConstantCP(final byte tag, final DataInput file) throws IOException {
    064        this(tag, file.readUnsignedShort(), file.readUnsignedShort());
    065    }
    066
    067    /**
    068     * Constructs a ConstantCP.
    069     *
    070     * @param tag the constant type tag.
    071     * @param classIndex Reference to the class containing the field.
    072     * @param nameAndTypeIndex and the field signature.
    073     */
    074    protected ConstantCP(final byte tag, final int classIndex, final int nameAndTypeIndex) {
    075        super(tag);
    076        this.class_index = classIndex;
    077        this.name_and_type_index = nameAndTypeIndex;
    078    }
    079
    080    /**
    081     * Initialize from another object.
    082     *
    083     * @param c Source to copy.
    084     */
    085    public ConstantCP(final ConstantCP c) {
    086        this(c.getTag(), c.getClassIndex(), c.getNameAndTypeIndex());
    087    }
    088
    089    /**
    090     * Dumps constant field reference to file stream in binary format.
    091     *
    092     * @param file Output file stream.
    093     * @throws IOException if an I/O error occurs.
    094     */
    095    @Override
    096    public final void dump(final DataOutputStream file) throws IOException {
    097        file.writeByte(super.getTag());
    098        file.writeShort(class_index);
    099        file.writeShort(name_and_type_index);
    100    }
    101
    102    /**
    103     * Gets the class this field belongs to.
    104     *
    105     * @param cp the constant pool.
    106     * @return Class this field belongs to.
    107     */
    108    public String getClass(final ConstantPool cp) {
    109        return cp.constantToString(class_index, Const.CONSTANT_Class);
    110    }
    111
    112    /**
    113     * Gets the reference (index) to class this constant refers to.
    114     *
    115     * @return Reference (index) to class this constant refers to.
    116     */
    117    public final int getClassIndex() {
    118        return class_index;
    119    }
    120
    121    /**
    122     * Gets the reference (index) to signature of the field.
    123     *
    124     * @return Reference (index) to signature of the field.
    125     */
    126    public final int getNameAndTypeIndex() {
    127        return name_and_type_index;
    128    }
    129
    130    /**
    131     * Sets the class index.
    132     *
    133     * @param classIndex points to Constant_class.
    134     */
    135    public final void setClassIndex(final int classIndex) {
    136        this.class_index = classIndex;
    137    }
    138
    139    /**
    140     * Sets the name and type index.
    141     *
    142     * @param nameAndTypeIndex points to Constant_NameAndType.
    143     */
    144    public final void setNameAndTypeIndex(final int nameAndTypeIndex) {
    145        this.name_and_type_index = nameAndTypeIndex;
    146    }
    147
    148    /**
    149     * @return String representation.
    150     *
    151     *         not final as ConstantInvokeDynamic needs to modify
    152     */
    153    @Override
    154    public String toString() {
    155        return super.toString() + "(class_index = " + class_index + ", name_and_type_index = " + name_and_type_index + ")";
    156    }
    157}