diff options
author | Andy Clement <andrew.clement@gmail.com> | 2013-04-25 13:46:44 -0700 |
---|---|---|
committer | Andy Clement <andrew.clement@gmail.com> | 2013-04-25 13:46:44 -0700 |
commit | e9e4852b10a10e1fa1b597d471cbafc693f87e15 (patch) | |
tree | a7f82c4a8f557f8f7845dec98ac1fcc8b63b3ee4 /bcel-builder | |
parent | 6afb281ef0a0f0afcfcf0c77d6b6ebcead15c363 (diff) | |
download | aspectj-e9e4852b10a10e1fa1b597d471cbafc693f87e15.tar.gz aspectj-e9e4852b10a10e1fa1b597d471cbafc693f87e15.zip |
utility class for dumping class files
Diffstat (limited to 'bcel-builder')
-rw-r--r-- | bcel-builder/testsrc/Play.java | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/bcel-builder/testsrc/Play.java b/bcel-builder/testsrc/Play.java new file mode 100644 index 000000000..024ef7a6d --- /dev/null +++ b/bcel-builder/testsrc/Play.java @@ -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); + } + } + } +} |