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