import java.io.*;

public class DumpConstantPool
{
  
  public static void main(String args[]) throws IOException
  {
     int i, cpc;

     RandomAccessFile raf = new RandomAccessFile(args[0], "rw");
  
     // check magic
     i = raf.readInt();
     if (i != 0xCAFEBABE) 
     {
        System.out.println(args[0] + " is not a Java class file.");
        return;
     } else {
        System.out.println("Class: " + args[0]);
    }
     
     // read version
     int minor = raf.readUnsignedShort();
     int major = raf.readUnsignedShort();
     System.out.println("Version: " + major + "." + minor);
    
     System.out.println("Constant Pool");
     // step through constant pool
     cpc = raf.readUnsignedShort();
     for (int j = 1 ; j < cpc ; j++)
     {
        i = raf.read();
        switch (i) {
           case 0: System.out.println("error!"); break;
           case 1: System.out.println(j + ": UTF " + raf.readUTF()); break;
           case 3: System.out.println(j + ": int " + raf.readInt()); break;
           case 4: System.out.println(j + ": float " + raf.readFloat()); break;
           case 5: System.out.println(j + ": long " + raf.readLong()); j++; break;
           case 6: System.out.println(j + ": double " + raf.readDouble()); j++; break;
           case 7: System.out.println(j + ": classinfo " + raf.readUnsignedShort()); break;
           case 8: System.out.println(j + ": stringindex " + raf.readUnsignedShort()); break;
           case 9: System.out.println(j + ": fieldref class: " + raf.readUnsignedShort() + " nameindex: " + raf.readUnsignedShort()); break;
           case 10: System.out.println(j + ": methodref class: " + raf.readUnsignedShort() + " nameindex: " + raf.readUnsignedShort()); break;
           case 11: System.out.println(j + ": ifmethodref class: " + raf.readUnsignedShort() + " nameindex: " + raf.readUnsignedShort()); break;
           case 12: System.out.println(j + ": nameandtype name: " + raf.readUnsignedShort() + " descriptor: " + raf.readUnsignedShort()); break;
           default: System.out.println("error!"); break;
        }
     }

     // read the access flags and class info indexes
     System.out.println("Access flags: " + raf.readUnsignedShort());
     System.out.println("Class Info Index: " + raf.readUnsignedShort());
     System.out.println("Superclass Info Index: " + raf.readUnsignedShort());

     raf.close();
  }
}
