View Javadoc
1   /*
2    *  Licensed to the Apache Software Foundation (ASF) under one or more
3    *  contributor license agreements.  See the NOTICE file distributed with
4    *  this work for additional information regarding copyright ownership.
5    *  The ASF licenses this file to You under the Apache License, Version 2.0
6    *  (the "License"); you may not use this file except in compliance with
7    *  the License.  You may obtain a copy of the License at
8    *
9    *     http://www.apache.org/licenses/LICENSE-2.0
10   *
11   *  Unless required by applicable law or agreed to in writing, software
12   *  distributed under the License is distributed on an "AS IS" BASIS,
13   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   *  See the License for the specific language governing permissions and
15   *  limitations under the License.
16   */
17  package org.apache.commons.compress.harmony.unpack200.bytecode;
18  
19  import java.io.DataOutputStream;
20  import java.io.IOException;
21  
22  /**
23   * ClassFile is used to represent and write out Java class files.
24   */
25  public class ClassFile {
26  
27      private static final int MAGIC = 0xCAFEBABE;
28  
29      public int major;
30      public int minor;
31      public ClassConstantPool pool = new ClassConstantPool();
32      public int accessFlags;
33      public int thisClass;
34      public int superClass;
35      public int[] interfaces;
36      public ClassFileEntry[] fields;
37      public ClassFileEntry[] methods;
38      public Attribute[] attributes;
39  
40      public void write(final DataOutputStream dos) throws IOException {
41          dos.writeInt(MAGIC);
42          dos.writeShort(minor);
43          dos.writeShort(major);
44          dos.writeShort(pool.size() + 1);
45          for (int i = 1; i <= pool.size(); i++) {
46              ConstantPoolEntry entry;
47              (entry = (ConstantPoolEntry) pool.get(i)).doWrite(dos);
48              // Doubles and longs take up two spaces in the pool, but only one
49              // gets written
50              if (entry.getTag() == ConstantPoolEntry.CP_Double || entry.getTag() == ConstantPoolEntry.CP_Long) {
51                  i++;
52              }
53          }
54          dos.writeShort(accessFlags);
55          dos.writeShort(thisClass);
56          dos.writeShort(superClass);
57          dos.writeShort(interfaces.length);
58          for (final int element : interfaces) {
59              dos.writeShort(element);
60          }
61          dos.writeShort(fields.length);
62          for (final ClassFileEntry field : fields) {
63              field.write(dos);
64          }
65          dos.writeShort(methods.length);
66          for (final ClassFileEntry method : methods) {
67              method.write(dos);
68          }
69          dos.writeShort(attributes.length);
70          for (final Attribute attribute : attributes) {
71              attribute.write(dos);
72          }
73      }
74  }