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 package org.osjava.jardiff;
40 import java.util.HashMap;
41 import java.util.Map;
42
43 import org.objectweb.asm.FieldVisitor;
44 import org.objectweb.asm.MethodVisitor;
45 import org.objectweb.asm.commons.EmptyVisitor;
46
47 /***
48 * A reusable class which uses the ASM to build up ClassInfo about a
49 * java class file.
50 *
51 * @author <a href="mailto:antony@cyberiantiger.org">Antony Riley</a>
52 */
53 public class ClassInfoVisitor extends EmptyVisitor
54 {
55 /***
56 * The class file version.
57 */
58 private int version;
59
60 /***
61 * The access flags for the class.
62 */
63
64 private int access;
65
66 /***
67 * The internal name of the class.
68 */
69 private String name;
70
71 /***
72 * The signature of the class
73 */
74 private String signature;
75
76 /***
77 * The internal name of the superclass.
78 */
79 private String supername;
80
81 /***
82 * An array of internal names of interfaces implemented by this class.
83 */
84 private String[] interfaces;
85
86 /***
87 * A map of method signature to a MethodInfo describing the method.
88 */
89 private Map methodMap;
90
91 /***
92 * A map of field signature to a FieldInfo describing the field.
93 */
94 private Map fieldMap;
95
96 /***
97 * Reset this ClassInfoVisitor so that it can be used to visit another
98 * class.
99 */
100 public void reset() {
101 methodMap = new HashMap();
102 fieldMap = new HashMap();
103 }
104
105 /***
106 * The the classInfo this ClassInfoVisitor has built up about a class
107 */
108 public ClassInfo getClassInfo() {
109 return new ClassInfo(version, access, name, signature, supername,
110 interfaces, methodMap, fieldMap);
111 }
112
113 /***
114 * Receive notification of information about a class from ASM.
115 *
116 * @param version the class file version number.
117 * @param access the access flags for the class.
118 * @param name the internal name of the class.
119 * @param signature the signature of the class.
120 * @param supername the internal name of the super class.
121 * @param interfaces the internal names of interfaces implemented.
122 */
123 public void visit(int version, int access, String name, String signature,
124 String supername, String[] interfaces) {
125 this.version = version;
126 this.access = access;
127 this.name = name;
128 this.signature = signature;
129 this.supername = supername;
130 this.interfaces = interfaces;
131 }
132
133 public MethodVisitor visitMethod(int access, String name, String desc,
134 String signature, String[] exceptions) {
135 methodMap.put(name + desc, new MethodInfo(access, name, desc,
136 signature, exceptions));
137 return null;
138 }
139
140 public FieldVisitor visitField(int access, String name, String desc,
141 String signature, Object value) {
142 fieldMap.put(name,
143 new FieldInfo(access, name, desc, signature, value));
144 return this;
145 }
146 }