1 cananian 1.1.2.1 // Javap.java, created by cananian
  2 cananian 1.1.2.1 // Copyright (C) 2002 C. Scott Ananian <cananian@alumni.princeton.edu>
  3 cananian 1.1.2.1 // Licensed under the terms of the GNU GPL; see COPYING for details.
  4 cananian 1.1.2.1 package harpoon.Main;
  5 cananian 1.1.2.1 
  6 cananian 1.1.2.1 import harpoon.ClassFile.HClass;
  7 cananian 1.1.2.1 import harpoon.ClassFile.HMethod;
  8 cananian 1.1.2.1 import harpoon.ClassFile.Linker;
  9 cananian 1.1.2.1 import harpoon.ClassFile.Loader;
 10 cananian 1.1.2.1 
 11 cananian 1.1.2.1 import java.lang.reflect.Modifier;
 12 cananian 1.1.2.1 
 13 cananian 1.1.2.1 /**
 14 cananian 1.1.2.1  * <code>Javap2</code> is a clone of the Sun <code>javap</code> tool,
 15 cananian 1.1.2.1  * using our higher-level bytecode file infrastructure.
 16 cananian 1.1.2.1  * 
 17 cananian 1.1.2.1  * @author  C. Scott Ananian <cananian@lesser-magoo.lcs.mit.edu>
 18 cananian 1.2      * @version $Id: Javap2.java,v 1.2 2002/04/10 03:06:09 cananian Exp $
 19 cananian 1.1.2.1  */
 20 cananian 1.1.2.1 public class Javap2 {
 21 cananian 1.1.2.1     public static void main(String[] args) throws ClassNotFoundException {
 22 cananian 1.1.2.1         Linker linker = Loader.systemLinker;
 23 cananian 1.1.2.1 
 24 cananian 1.1.2.1         HClass c = linker.forName(args[0]);
 25 cananian 1.1.2.1         System.out.print(modString(c.getModifiers(), true));
 26 cananian 1.1.2.1         System.out.print(getTypeName(c));
 27 cananian 1.1.2.1         // supertypes
 28 cananian 1.1.2.1         HClass sc = c.getSuperclass();
 29 cananian 1.1.2.1         if (sc!=null && !sc.getName().equals("java.lang.Object")) {
 30 cananian 1.1.2.1             System.out.print(" extends ");
 31 cananian 1.1.2.1             System.out.print(getTypeName(sc));
 32 cananian 1.1.2.1         }
 33 cananian 1.1.2.1         // interfaces
 34 cananian 1.1.2.1         HClass in[] = c.getInterfaces();
 35 cananian 1.1.2.1         if (in.length>0) System.out.print(" implements ");
 36 cananian 1.1.2.1         for (int i=0; i<in.length; i++) {
 37 cananian 1.1.2.1             System.out.print(getTypeName(in[i]));
 38 cananian 1.1.2.1             if (i+1<in.length) System.out.print(", ");
 39 cananian 1.1.2.1         }
 40 cananian 1.1.2.1         System.out.println();
 41 cananian 1.1.2.1         System.out.println("{");
 42 cananian 1.1.2.1         // methods
 43 cananian 1.1.2.1         HMethod[] m = c.getDeclaredMethods();
 44 cananian 1.1.2.1         for (int i=0; i<m.length; i++) {
 45 cananian 1.1.2.1             System.out.print("    ");
 46 cananian 1.1.2.1             System.out.print(modString(m[i].getModifiers(), false));
 47 cananian 1.1.2.1             System.out.print(getTypeName(m[i].getReturnType()));
 48 cananian 1.1.2.1             System.out.print(" ");
 49 cananian 1.1.2.1             System.out.print(m[i].getName());
 50 cananian 1.1.2.1             System.out.print("(");
 51 cananian 1.1.2.1             // parameters
 52 cananian 1.1.2.1             HClass[] p = m[i].getParameterTypes();
 53 cananian 1.1.2.1             for (int j=0; j<p.length; j++) {
 54 cananian 1.1.2.1                 System.out.print(getTypeName(p[j]));
 55 cananian 1.1.2.1                 if (j+1<p.length) System.out.print(", ");
 56 cananian 1.1.2.1             }
 57 cananian 1.1.2.1             System.out.print(")");
 58 cananian 1.1.2.1             // exceptions
 59 cananian 1.1.2.1             HClass[] e = m[i].getExceptionTypes();
 60 cananian 1.1.2.1             if (e.length > 0) System.out.print(" throws ");
 61 cananian 1.1.2.1             for (int j=0; j<e.length; j++) {
 62 cananian 1.1.2.1                 System.out.print(getTypeName(e[j]));
 63 cananian 1.1.2.1                 if (j+1<e.length) System.out.print(", ");
 64 cananian 1.1.2.1             }
 65 cananian 1.1.2.1             System.out.print(";");
 66 cananian 1.1.2.1             System.out.println();
 67 cananian 1.1.2.1         }
 68 cananian 1.1.2.1         System.out.println("}");
 69 cananian 1.1.2.1     }
 70 cananian 1.1.2.1     static String modString(int mods, boolean isClass) {
 71 cananian 1.1.2.1         StringBuffer sb = new StringBuffer();
 72 cananian 1.1.2.1         if (Modifier.isPrivate(mods)) sb.append("private ");
 73 cananian 1.1.2.1         if (Modifier.isProtected(mods)) sb.append("protected ");
 74 cananian 1.1.2.1         if (Modifier.isPublic(mods)) sb.append("public ");
 75 cananian 1.1.2.1 
 76 cananian 1.1.2.1         if (Modifier.isAbstract(mods) && !Modifier.isInterface(mods))
 77 cananian 1.1.2.1             sb.append("abstract ");
 78 cananian 1.1.2.1         if (Modifier.isFinal(mods)) sb.append("final ");
 79 cananian 1.1.2.1         if (Modifier.isInterface(mods)) sb.append("interface ");
 80 cananian 1.1.2.1         else if (isClass) sb.append("class ");
 81 cananian 1.1.2.1         if (Modifier.isNative(mods)) sb.append("native ");
 82 cananian 1.1.2.1         if (Modifier.isStatic(mods)) sb.append("static ");
 83 cananian 1.1.2.1         if (Modifier.isStrict(mods)) sb.append("strict ");
 84 cananian 1.1.2.1         if (Modifier.isSynchronized(mods)) sb.append("synchronized ");
 85 cananian 1.1.2.1         if (Modifier.isTransient(mods)) sb.append("transient ");
 86 cananian 1.1.2.1         if (Modifier.isVolatile(mods)) sb.append("volatile ");
 87 cananian 1.1.2.1         return sb.toString();
 88 cananian 1.1.2.1     }
 89 cananian 1.1.2.1     static String getTypeName(HClass hc) {
 90 cananian 1.1.2.1         if (hc.isArray()) {
 91 cananian 1.1.2.1             StringBuffer r = new StringBuffer();
 92 cananian 1.1.2.1             HClass sup = hc;
 93 cananian 1.1.2.1             int i=0;
 94 cananian 1.1.2.1             for (; sup.isArray(); sup = sup.getComponentType())
 95 cananian 1.1.2.1                 i++;
 96 cananian 1.1.2.1             r.append(sup.getName());
 97 cananian 1.1.2.1             for (int j=0; j<i; j++)
 98 cananian 1.1.2.1                 r.append("[]");
 99 cananian 1.1.2.1             return r.toString();
100 cananian 1.1.2.1         }
101 cananian 1.1.2.1         return hc.getName();
102 cananian 1.1.2.1     }
103 cananian 1.2     }