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 }