16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
20 */
21
22 package com.sun.org.apache.bcel.internal.classfile;
23
24 import java.io.DataInput;
25 import java.io.DataOutputStream;
26 import java.io.IOException;
27
28 import com.sun.org.apache.bcel.internal.Const;
29
30 /**
31 * This class is derived from <em>Attribute</em> and denotes that this class
32 * is an Inner class of another.
33 * to the source file of this class.
34 * It is instantiated from the <em>Attribute.readAttribute()</em> method.
35 *
36 * @version $Id$
37 * @see Attribute
38 */
39 public final class InnerClasses extends Attribute {
40
41 private InnerClass[] inner_classes;
42
43
44 /**
45 * Initialize from another object. Note that both objects use the same
46 * references (shallow copy). Use clone() for a physical copy.
47 */
48 public InnerClasses(final InnerClasses c) {
49 this(c.getNameIndex(), c.getLength(), c.getInnerClasses(), c.getConstantPool());
50 }
51
52
53 /**
54 * @param name_index Index in constant pool to CONSTANT_Utf8
55 * @param length Content length in bytes
56 * @param inner_classes array of inner classes attributes
86 /**
87 * Called by objects that are traversing the nodes of the tree implicitely
88 * defined by the contents of a Java class. I.e., the hierarchy of methods,
89 * fields, attributes, etc. spawns a tree of objects.
90 *
91 * @param v Visitor object
92 */
93 @Override
94 public void accept( final Visitor v ) {
95 v.visitInnerClasses(this);
96 }
97
98
99 /**
100 * Dump source file attribute to file stream in binary format.
101 *
102 * @param file Output file stream
103 * @throws IOException
104 */
105 @Override
106 public final void dump( final DataOutputStream file ) throws IOException {
107 super.dump(file);
108 file.writeShort(inner_classes.length);
109 for (final InnerClass inner_class : inner_classes) {
110 inner_class.dump(file);
111 }
112 }
113
114
115 /**
116 * @return array of inner class "records"
117 */
118 public final InnerClass[] getInnerClasses() {
119 return inner_classes;
120 }
121
122
123 /**
124 * @param inner_classes the array of inner classes
125 */
126 public final void setInnerClasses( final InnerClass[] inner_classes ) {
127 this.inner_classes = inner_classes != null ? inner_classes : new InnerClass[0];
128 }
129
130
131 /**
132 * @return String representation.
133 */
134 @Override
135 public final String toString() {
136 final StringBuilder buf = new StringBuilder();
137 buf.append("InnerClasses(");
138 buf.append(inner_classes.length);
139 buf.append("):\n");
140 for (final InnerClass inner_class : inner_classes) {
141 buf.append(inner_class.toString(super.getConstantPool())).append("\n");
142 }
143 return buf.toString();
144 }
145
146
147 /**
148 * @return deep copy of this attribute
149 */
150 @Override
151 public Attribute copy( final ConstantPool _constant_pool ) {
152 // TODO this could be recoded to use a lower level constructor after creating a copy of the inner classes
153 final InnerClasses c = (InnerClasses) clone();
154 c.inner_classes = new InnerClass[inner_classes.length];
155 for (int i = 0; i < inner_classes.length; i++) {
156 c.inner_classes[i] = inner_classes[i].copy();
157 }
158 c.setConstantPool(_constant_pool);
159 return c;
160 }
161 }
|
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
20 */
21
22 package com.sun.org.apache.bcel.internal.classfile;
23
24 import java.io.DataInput;
25 import java.io.DataOutputStream;
26 import java.io.IOException;
27
28 import com.sun.org.apache.bcel.internal.Const;
29
30 /**
31 * This class is derived from <em>Attribute</em> and denotes that this class
32 * is an Inner class of another.
33 * to the source file of this class.
34 * It is instantiated from the <em>Attribute.readAttribute()</em> method.
35 *
36 * @see Attribute
37 */
38 public final class InnerClasses extends Attribute {
39
40 private InnerClass[] inner_classes;
41
42
43 /**
44 * Initialize from another object. Note that both objects use the same
45 * references (shallow copy). Use clone() for a physical copy.
46 */
47 public InnerClasses(final InnerClasses c) {
48 this(c.getNameIndex(), c.getLength(), c.getInnerClasses(), c.getConstantPool());
49 }
50
51
52 /**
53 * @param name_index Index in constant pool to CONSTANT_Utf8
54 * @param length Content length in bytes
55 * @param inner_classes array of inner classes attributes
85 /**
86 * Called by objects that are traversing the nodes of the tree implicitely
87 * defined by the contents of a Java class. I.e., the hierarchy of methods,
88 * fields, attributes, etc. spawns a tree of objects.
89 *
90 * @param v Visitor object
91 */
92 @Override
93 public void accept( final Visitor v ) {
94 v.visitInnerClasses(this);
95 }
96
97
98 /**
99 * Dump source file attribute to file stream in binary format.
100 *
101 * @param file Output file stream
102 * @throws IOException
103 */
104 @Override
105 public void dump( final DataOutputStream file ) throws IOException {
106 super.dump(file);
107 file.writeShort(inner_classes.length);
108 for (final InnerClass inner_class : inner_classes) {
109 inner_class.dump(file);
110 }
111 }
112
113
114 /**
115 * @return array of inner class "records"
116 */
117 public InnerClass[] getInnerClasses() {
118 return inner_classes;
119 }
120
121
122 /**
123 * @param inner_classes the array of inner classes
124 */
125 public void setInnerClasses( final InnerClass[] inner_classes ) {
126 this.inner_classes = inner_classes != null ? inner_classes : new InnerClass[0];
127 }
128
129
130 /**
131 * @return String representation.
132 */
133 @Override
134 public String toString() {
135 final StringBuilder buf = new StringBuilder();
136 buf.append("InnerClasses(");
137 buf.append(inner_classes.length);
138 buf.append("):\n");
139 for (final InnerClass inner_class : inner_classes) {
140 buf.append(inner_class.toString(super.getConstantPool())).append("\n");
141 }
142 return buf.substring(0, buf.length()-1); // remove the last newline
143 }
144
145
146 /**
147 * @return deep copy of this attribute
148 */
149 @Override
150 public Attribute copy( final ConstantPool _constant_pool ) {
151 // TODO this could be recoded to use a lower level constructor after creating a copy of the inner classes
152 final InnerClasses c = (InnerClasses) clone();
153 c.inner_classes = new InnerClass[inner_classes.length];
154 for (int i = 0; i < inner_classes.length; i++) {
155 c.inner_classes[i] = inner_classes[i].copy();
156 }
157 c.setConstantPool(_constant_pool);
158 return c;
159 }
160 }
|