blob: 9fef2fa6cc6d7b54fbf01b32d56110a35cf4f1e0 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
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;
import org.aspectj.apache.bcel.classfile.annotation.RuntimeAnnos;
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) throws Exception {
for (Attribute attribute: attributes) {
String n = attribute.getName();
if (n.equals("RuntimeInvisibleAnnotations") ||
n.equals("RuntimeVisibleAnnotations")) {
RuntimeAnnos ra = (RuntimeAnnos)attribute;
// private byte[] annotation_data;
java.lang.reflect.Field f = RuntimeAnnos.class.getDeclaredField("annotation_data");
f.setAccessible(true);
byte[] bs = (byte[])f.get(ra);
// byte[] bs = unknown.getBytes();
printBytes(bs);
}
}
}
}
|