56 public static final int ACC_SYNTHETIC = 0x1000; // class, inner, field, method |
56 public static final int ACC_SYNTHETIC = 0x1000; // class, inner, field, method |
57 public static final int ACC_ANNOTATION = 0x2000; // class, inner |
57 public static final int ACC_ANNOTATION = 0x2000; // class, inner |
58 public static final int ACC_ENUM = 0x4000; // class, inner, field |
58 public static final int ACC_ENUM = 0x4000; // class, inner, field |
59 public static final int ACC_MODULE = 0x8000; // class, inner, field, method |
59 public static final int ACC_MODULE = 0x8000; // class, inner, field, method |
60 |
60 |
61 private static enum Type { Class, InnerClass, Field, Method}; |
61 public static enum Kind { Class, InnerClass, Field, Method}; |
62 |
62 |
63 AccessFlags(ClassReader cr) throws IOException { |
63 AccessFlags(ClassReader cr) throws IOException { |
64 this(cr.readUnsignedShort()); |
64 this(cr.readUnsignedShort()); |
65 } |
65 } |
66 |
66 |
85 ACC_SYNTHETIC, ACC_ANNOTATION, ACC_ENUM, ACC_MODULE |
85 ACC_SYNTHETIC, ACC_ANNOTATION, ACC_ENUM, ACC_MODULE |
86 }; |
86 }; |
87 |
87 |
88 public Set<String> getClassModifiers() { |
88 public Set<String> getClassModifiers() { |
89 int f = ((flags & ACC_INTERFACE) != 0 ? flags & ~ACC_ABSTRACT : flags); |
89 int f = ((flags & ACC_INTERFACE) != 0 ? flags & ~ACC_ABSTRACT : flags); |
90 return getModifiers(f, classModifiers, Type.Class); |
90 return getModifiers(f, classModifiers, Kind.Class); |
91 } |
91 } |
92 |
92 |
93 public Set<String> getClassFlags() { |
93 public Set<String> getClassFlags() { |
94 return getFlags(classFlags, Type.Class); |
94 return getFlags(classFlags, Kind.Class); |
95 } |
95 } |
96 |
96 |
97 private static final int[] innerClassModifiers = { |
97 private static final int[] innerClassModifiers = { |
98 ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, |
98 ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, |
99 ACC_ABSTRACT, ACC_MODULE |
99 ACC_ABSTRACT, ACC_MODULE |
104 ACC_INTERFACE, ACC_ABSTRACT, ACC_SYNTHETIC, ACC_ANNOTATION, ACC_ENUM, ACC_MODULE |
104 ACC_INTERFACE, ACC_ABSTRACT, ACC_SYNTHETIC, ACC_ANNOTATION, ACC_ENUM, ACC_MODULE |
105 }; |
105 }; |
106 |
106 |
107 public Set<String> getInnerClassModifiers() { |
107 public Set<String> getInnerClassModifiers() { |
108 int f = ((flags & ACC_INTERFACE) != 0 ? flags & ~ACC_ABSTRACT : flags); |
108 int f = ((flags & ACC_INTERFACE) != 0 ? flags & ~ACC_ABSTRACT : flags); |
109 return getModifiers(f, innerClassModifiers, Type.InnerClass); |
109 return getModifiers(f, innerClassModifiers, Kind.InnerClass); |
110 } |
110 } |
111 |
111 |
112 public Set<String> getInnerClassFlags() { |
112 public Set<String> getInnerClassFlags() { |
113 return getFlags(innerClassFlags, Type.InnerClass); |
113 return getFlags(innerClassFlags, Kind.InnerClass); |
114 } |
114 } |
115 |
115 |
116 private static final int[] fieldModifiers = { |
116 private static final int[] fieldModifiers = { |
117 ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, |
117 ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, |
118 ACC_VOLATILE, ACC_TRANSIENT, ACC_MODULE |
118 ACC_VOLATILE, ACC_TRANSIENT, ACC_MODULE |
122 ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, |
122 ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, |
123 ACC_VOLATILE, ACC_TRANSIENT, ACC_SYNTHETIC, ACC_ENUM, ACC_MODULE |
123 ACC_VOLATILE, ACC_TRANSIENT, ACC_SYNTHETIC, ACC_ENUM, ACC_MODULE |
124 }; |
124 }; |
125 |
125 |
126 public Set<String> getFieldModifiers() { |
126 public Set<String> getFieldModifiers() { |
127 return getModifiers(fieldModifiers, Type.Field); |
127 return getModifiers(fieldModifiers, Kind.Field); |
128 } |
128 } |
129 |
129 |
130 public Set<String> getFieldFlags() { |
130 public Set<String> getFieldFlags() { |
131 return getFlags(fieldFlags, Type.Field); |
131 return getFlags(fieldFlags, Kind.Field); |
132 } |
132 } |
133 |
133 |
134 private static final int[] methodModifiers = { |
134 private static final int[] methodModifiers = { |
135 ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, |
135 ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, |
136 ACC_SYNCHRONIZED, ACC_NATIVE, ACC_ABSTRACT, ACC_STRICT, ACC_MODULE |
136 ACC_SYNCHRONIZED, ACC_NATIVE, ACC_ABSTRACT, ACC_STRICT, ACC_MODULE |
141 ACC_SYNCHRONIZED, ACC_BRIDGE, ACC_VARARGS, ACC_NATIVE, ACC_ABSTRACT, |
141 ACC_SYNCHRONIZED, ACC_BRIDGE, ACC_VARARGS, ACC_NATIVE, ACC_ABSTRACT, |
142 ACC_STRICT, ACC_SYNTHETIC, ACC_MODULE |
142 ACC_STRICT, ACC_SYNTHETIC, ACC_MODULE |
143 }; |
143 }; |
144 |
144 |
145 public Set<String> getMethodModifiers() { |
145 public Set<String> getMethodModifiers() { |
146 return getModifiers(methodModifiers, Type.Method); |
146 return getModifiers(methodModifiers, Kind.Method); |
147 } |
147 } |
148 |
148 |
149 public Set<String> getMethodFlags() { |
149 public Set<String> getMethodFlags() { |
150 return getFlags(methodFlags, Type.Method); |
150 return getFlags(methodFlags, Kind.Method); |
151 } |
151 } |
152 |
152 |
153 private Set<String> getModifiers(int[] modifierFlags, Type t) { |
153 private Set<String> getModifiers(int[] modifierFlags, Kind t) { |
154 return getModifiers(flags, modifierFlags, t); |
154 return getModifiers(flags, modifierFlags, t); |
155 } |
155 } |
156 |
156 |
157 private static Set<String> getModifiers(int flags, int[] modifierFlags, Type t) { |
157 private static Set<String> getModifiers(int flags, int[] modifierFlags, Kind t) { |
158 Set<String> s = new LinkedHashSet<String>(); |
158 Set<String> s = new LinkedHashSet<String>(); |
159 for (int m: modifierFlags) { |
159 for (int m: modifierFlags) { |
160 if ((flags & m) != 0) |
160 if ((flags & m) != 0) |
161 s.add(flagToModifier(m, t)); |
161 s.add(flagToModifier(m, t)); |
162 } |
162 } |
163 return s; |
163 return s; |
164 } |
164 } |
165 |
165 |
166 private Set<String> getFlags(int[] expectedFlags, Type t) { |
166 private Set<String> getFlags(int[] expectedFlags, Kind t) { |
167 Set<String> s = new LinkedHashSet<String>(); |
167 Set<String> s = new LinkedHashSet<String>(); |
168 int f = flags; |
168 int f = flags; |
169 for (int e: expectedFlags) { |
169 for (int e: expectedFlags) { |
170 if ((f & e) != 0) { |
170 if ((f & e) != 0) { |
171 s.add(flagToName(e, t)); |
171 s.add(flagToName(e, t)); |