View Javadoc
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 declares this class as
66   * `synthetic', i.e., it needs special handling.  The JVM specification
67   * states "A class member that does not appear in the source code must be
68   * marked using a Synthetic attribute."  It may appear in the ClassFile
69   * attribute table, a field_info table or a method_info table.  This class
70   * is intended to be instantiated from the
71   * <em>Attribute.readAttribute()</em> method.
72   *
73   * @author  <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
74   * @see     Attribute
75   */
76  public final class Synthetic extends Attribute {
77    private byte[] bytes;
78  
79    /**
80     * Initialize from another object. Note that both objects use the same
81     * references (shallow copy). Use copy() for a physical copy.
82     */
83    public Synthetic(Synthetic c) {
84      this(c.getNameIndex(), c.getLength(), c.getBytes(), c.getConstantPool());
85    }
86  
87    /**
88     * @param name_index Index in constant pool to CONSTANT_Utf8, which
89     * should represent the string "Synthetic".
90     * @param length Content length in bytes - should be zero.
91     * @param bytes Attribute contents
92     * @param constant_pool The constant pool this attribute is associated
93     * with.
94     */
95    public Synthetic(int name_index, int length, byte[] bytes,
96                     ConstantPool constant_pool)
97    {
98      super(Constants.ATTR_SYNTHETIC, name_index, length, constant_pool);
99      this.bytes         = bytes;
100   }
101 
102   /**
103    * Construct object from file stream.
104    * @param name_index Index in constant pool to CONSTANT_Utf8
105    * @param length Content length in bytes
106    * @param file Input stream
107    * @param constant_pool Array of constants
108    * @throws IOException
109    */
110   Synthetic(int name_index, int length, DataInputStream file,
111             ConstantPool constant_pool) throws IOException
112   {
113     this(name_index, length, (byte [])null, constant_pool);
114 
115     if(length > 0) {
116       bytes = new byte[length];
117       file.readFully(bytes);
118       System.err.println("Synthetic attribute with length > 0");
119     }
120   }
121   /**
122    * Called by objects that are traversing the nodes of the tree implicitely
123    * defined by the contents of a Java class. I.e., the hierarchy of methods,
124    * fields, attributes, etc. spawns a tree of objects.
125    *
126    * @param v Visitor object
127    */
128   public void accept(Visitor v) {
129     v.visitSynthetic(this);
130   }
131   /**
132    * Dump source file attribute to file stream in binary format.
133    *
134    * @param file Output file stream
135    * @throws IOException
136    */
137   public final void dump(DataOutputStream file) throws IOException
138   {
139     super.dump(file);
140     if(length > 0)
141       file.write(bytes, 0, length);
142   }
143   /**
144    * @return data bytes.
145    */
146   public final byte[] getBytes() { return bytes; }
147 
148   /**
149    * @param bytes.
150    */
151   public final void setBytes(byte[] bytes) {
152     this.bytes = bytes;
153   }
154 
155   /**
156    * @return String representation.
157    */
158   public final String toString() {
159     StringBuffer buf = new StringBuffer("Synthetic");
160 
161     if(length > 0)
162       buf.append(" " + Utility.toHexString(bytes));
163 
164     return buf.toString();
165   }
166 
167   /**
168    * @return deep copy of this attribute
169    */
170   public Attribute copy(ConstantPool constant_pool) {
171     Synthetic c = (Synthetic)clone();
172 
173     if(bytes != null)
174       c.bytes = (byte[])bytes.clone();
175 
176     c.constant_pool = constant_pool;
177     return c;
178   }
179 }