]> source.dussan.org Git - aspectj.git/commitdiff
utility class for dumping class files
authorAndy Clement <andrew.clement@gmail.com>
Thu, 25 Apr 2013 20:46:44 +0000 (13:46 -0700)
committerAndy Clement <andrew.clement@gmail.com>
Thu, 25 Apr 2013 20:46:44 +0000 (13:46 -0700)
bcel-builder/testsrc/Play.java [new file with mode: 0644]

diff --git a/bcel-builder/testsrc/Play.java b/bcel-builder/testsrc/Play.java
new file mode 100644 (file)
index 0000000..024ef7a
--- /dev/null
@@ -0,0 +1,79 @@
+import java.io.File;
+import java.io.FileInputStream;
+
+import org.aspectj.apache.bcel.classfile.Attribute;
+import org.aspectj.apache.bcel.classfile.ClassParser;
+import org.aspectj.apache.bcel.classfile.Field;
+import org.aspectj.apache.bcel.classfile.JavaClass;
+import org.aspectj.apache.bcel.classfile.Method;
+import org.aspectj.apache.bcel.classfile.Unknown;
+
+
+public class Play {
+       
+       public static void printBytes(byte[] bs) {
+               StringBuilder sb = new StringBuilder("Bytes:"+bs.length+"[");
+               for (int i=0;i<bs.length;i++) {
+                       if (i>0) sb.append(" ");
+                       sb.append(bs[i]);
+               }
+               sb.append("]");
+               System.out.println(sb);
+       }
+       
+       public static void main(String[] args) throws Exception {
+               if (args==null || args.length==0 ) {
+                       System.out.println("Specify a file");
+                       return;
+               }
+               if (!args[0].endsWith(".class")) {
+                       args[0] = args[0]+".class";
+               }
+               FileInputStream fis = new FileInputStream(new File(args[0]));
+               ClassParser cp = new ClassParser(fis,args[0]);
+               JavaClass jc = cp.parse();
+               Attribute[] attributes = jc.getAttributes();
+               printUsefulAttributes(attributes);
+               System.out.println("Fields");
+               Field[] fs = jc.getFields();
+               if (fs!=null) {
+                       for (Field f: fs) {
+                               System.out.println(f);
+                               printUsefulAttributes(f.getAttributes());
+                       }
+               }
+               System.out.println("Methods");
+               Method[] ms = jc.getMethods();
+               if (ms!=null) {
+                       for (Method m: ms) {
+                               System.out.println(m);
+                               printUsefulAttributes(m.getAttributes());
+                               System.out.println("Code attributes:");
+                               printUsefulAttributes(m.getCode().getAttributes());
+                       }
+               }
+//             Method[] ms = jc.getMethods();
+//             for (Method m: ms) {
+//                     System.out.println("==========");
+//                     System.out.println("Method: "+m.getName()+" modifiers=0x"+Integer.toHexString(m.getModifiers()));
+//                     Attribute[] as = m.getAttributes();
+//                     for (Attribute a: as) {
+//                             if (a.getName().toLowerCase().contains("synthetic")) {
+//                                     System.out.println("> "+a.getName());
+//                             }
+//                     }
+//             }
+       }
+
+       private static void printUsefulAttributes(Attribute[] attributes) {
+               for (Attribute attribute: attributes) {
+                       String n = attribute.getName();
+                       if (n.equals("RuntimeInvisibleTypeAnnotations") ||
+                               n.equals("RuntimeVisibleTypeAnnotations")) {
+                               Unknown unknown = (Unknown)attribute;
+                               byte[] bs = unknown.getBytes();
+                               printBytes(bs);
+                       }
+               }
+       }
+}