001/*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 *
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 *
011 *  Unless required by applicable law or agreed to in writing, software
012 *  distributed under the License is distributed on an "AS IS" BASIS,
013 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 *  See the License for the specific language governing permissions and
015 *  limitations under the License.
016 *
017 */
018package org.apache.bcel.classfile;
019
020import java.io.DataInput;
021import java.io.DataOutputStream;
022import java.io.IOException;
023
024import org.apache.bcel.Const;
025
026/** 
027 * This class is derived from the abstract {@link Constant}
028 * and represents a reference to a String object.
029 *
030 * @version $Id: ConstantString.java 1749603 2016-06-21 20:50:19Z ggregory $
031 * @see     Constant
032 */
033public final class ConstantString extends Constant implements ConstantObject {
034
035    private int string_index; // Identical to ConstantClass except for this name
036
037
038    /**
039     * Initialize from another object.
040     */
041    public ConstantString(final ConstantString c) {
042        this(c.getStringIndex());
043    }
044
045
046    /** 
047     * Initialize instance from file data.
048     *
049     * @param file Input stream
050     * @throws IOException
051     */
052    ConstantString(final DataInput file) throws IOException {
053        this(file.readUnsignedShort());
054    }
055
056
057    /**
058     * @param string_index Index of Constant_Utf8 in constant pool
059     */
060    public ConstantString(final int string_index) {
061        super(Const.CONSTANT_String);
062        this.string_index = string_index;
063    }
064
065
066    /**
067     * Called by objects that are traversing the nodes of the tree implicitely
068     * defined by the contents of a Java class. I.e., the hierarchy of methods,
069     * fields, attributes, etc. spawns a tree of objects.
070     *
071     * @param v Visitor object
072     */
073    @Override
074    public void accept( final Visitor v ) {
075        v.visitConstantString(this);
076    }
077
078
079    /**
080     * Dump constant field reference to file stream in binary format.
081     *
082     * @param file Output file stream
083     * @throws IOException
084     */
085    @Override
086    public final void dump( final DataOutputStream file ) throws IOException {
087        file.writeByte(super.getTag());
088        file.writeShort(string_index);
089    }
090
091
092    /**
093     * @return Index in constant pool of the string (ConstantUtf8).
094     */
095    public final int getStringIndex() {
096        return string_index;
097    }
098
099
100    /**
101     * @param string_index the index into the constant of the string value
102     */
103    public final void setStringIndex( final int string_index ) {
104        this.string_index = string_index;
105    }
106
107
108    /**
109     * @return String representation.
110     */
111    @Override
112    public final String toString() {
113        return super.toString() + "(string_index = " + string_index + ")";
114    }
115
116
117    /** @return String object
118     */
119    @Override
120    public Object getConstantValue( final ConstantPool cp ) {
121        final Constant c = cp.getConstant(string_index, Const.CONSTANT_Utf8);
122        return ((ConstantUtf8) c).getBytes();
123    }
124
125
126    /** @return dereferenced string
127     */
128    public String getBytes( final ConstantPool cp ) {
129        return (String) getConstantValue(cp);
130    }
131}