1 /* 2 * reserved comment block 3 * DO NOT REMOVE OR ALTER! 4 */ 5 package com.sun.org.apache.bcel.internal.classfile; 6 7 /* ==================================================================== 8 * The Apache Software License, Version 1.1 9 * 10 * Copyright (c) 2001 The Apache Software Foundation. All rights 11 * reserved. 12 * 13 * Redistribution and use in source and binary forms, with or without 14 * modification, are permitted provided that the following conditions 15 * are met: 16 * 17 * 1. Redistributions of source code must retain the above copyright 18 * notice, this list of conditions and the following disclaimer. 19 * 20 * 2. Redistributions in binary form must reproduce the above copyright 21 * notice, this list of conditions and the following disclaimer in 22 * the documentation and/or other materials provided with the 23 * distribution. 24 * 25 * 3. The end-user documentation included with the redistribution, 26 * if any, must include the following acknowledgment: 27 * "This product includes software developed by the 28 * Apache Software Foundation (http://www.apache.org/)." 29 * Alternately, this acknowledgment may appear in the software itself, 30 * if and wherever such third-party acknowledgments normally appear. 31 * 32 * 4. The names "Apache" and "Apache Software Foundation" and 33 * "Apache BCEL" must not be used to endorse or promote products 34 * derived from this software without prior written permission. For 35 * written permission, please contact apache@apache.org. 36 * 37 * 5. Products derived from this software may not be called "Apache", 38 * "Apache BCEL", nor may "Apache" appear in their name, without 39 * prior written permission of the Apache Software Foundation. 40 * 41 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED 42 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 43 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 44 * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR 45 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 46 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 47 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF 48 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 49 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 50 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 51 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 52 * SUCH DAMAGE. 53 * ==================================================================== 54 * 55 * This software consists of voluntary contributions made by many 56 * individuals on behalf of the Apache Software Foundation. For more 57 * information on the Apache Software Foundation, please see 58 * <http://www.apache.org/>. 59 */ 60 61 import com.sun.org.apache.bcel.internal.Constants; 62 import java.io.*; 63 64 /** 65 * This class is derived from <em>Attribute</em> and represents a constant 66 * value, i.e., a default value for initializing a class field. 67 * This class is instantiated by the <em>Attribute.readAttribute()</em> method. 68 * 69 * @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A> 70 * @see Attribute 71 */ 72 public final class ConstantValue extends Attribute { 73 private int constantvalue_index; 74 75 /** 76 * Initialize from another object. Note that both objects use the same 77 * references (shallow copy). Use clone() for a physical copy. 78 */ 79 public ConstantValue(ConstantValue c) { 80 this(c.getNameIndex(), c.getLength(), c.getConstantValueIndex(), 81 c.getConstantPool()); 82 } 83 84 /** 85 * Construct object from file stream. 86 * @param name_index Name index in constant pool 87 * @param length Content length in bytes 88 * @param file Input stream 89 * @param constant_pool Array of constants 90 * @throw IOException 91 */ 92 ConstantValue(int name_index, int length, DataInputStream file, 93 ConstantPool constant_pool) throws IOException 94 { 95 this(name_index, length, (int)file.readUnsignedShort(), constant_pool); 96 } 97 98 /** 99 * @param name_index Name index in constant pool 100 * @param length Content length in bytes 101 * @param constantvalue_index Index in constant pool 102 * @param constant_pool Array of constants 103 */ 104 public ConstantValue(int name_index, int length, 105 int constantvalue_index, 106 ConstantPool constant_pool) 107 { 108 super(Constants.ATTR_CONSTANT_VALUE, name_index, length, constant_pool); 109 this.constantvalue_index = constantvalue_index; 110 } 111 112 /** 113 * Called by objects that are traversing the nodes of the tree implicitely 114 * defined by the contents of a Java class. I.e., the hierarchy of methods, 115 * fields, attributes, etc. spawns a tree of objects. 116 * 117 * @param v Visitor object 118 */ 119 public void accept(Visitor v) { 120 v.visitConstantValue(this); 121 } 122 /** 123 * Dump constant value attribute to file stream on binary format. 124 * 125 * @param file Output file stream 126 * @throws IOException 127 */ 128 public final void dump(DataOutputStream file) throws IOException 129 { 130 super.dump(file); 131 file.writeShort(constantvalue_index); 132 } 133 /** 134 * @return Index in constant pool of constant value. 135 */ 136 public final int getConstantValueIndex() { return constantvalue_index; } 137 138 /** 139 * @param constantvalue_index. 140 */ 141 public final void setConstantValueIndex(int constantvalue_index) { 142 this.constantvalue_index = constantvalue_index; 143 } 144 145 /** 146 * @return String representation of constant value. 147 */ 148 public final String toString() { 149 Constant c = constant_pool.getConstant(constantvalue_index); 150 151 String buf; 152 int i; 153 154 // Print constant to string depending on its type 155 switch(c.getTag()) { 156 case Constants.CONSTANT_Long: buf = "" + ((ConstantLong)c).getBytes(); break; 157 case Constants.CONSTANT_Float: buf = "" + ((ConstantFloat)c).getBytes(); break; 158 case Constants.CONSTANT_Double: buf = "" + ((ConstantDouble)c).getBytes(); break; 159 case Constants.CONSTANT_Integer: buf = "" + ((ConstantInteger)c).getBytes(); break; 160 case Constants.CONSTANT_String: 161 i = ((ConstantString)c).getStringIndex(); 162 c = constant_pool.getConstant(i, Constants.CONSTANT_Utf8); 163 buf = "\"" + Utility.convertString(((ConstantUtf8)c).getBytes()) + "\""; 164 break; 165 166 default: 167 throw new IllegalStateException("Type of ConstValue invalid: " + c); 168 } 169 170 return buf; 171 } 172 173 /** 174 * @return deep copy of this attribute 175 */ 176 public Attribute copy(ConstantPool constant_pool) { 177 ConstantValue c = (ConstantValue)clone(); 178 c.constant_pool = constant_pool; 179 return c; 180 } 181 }