39 */ 40 public class AccessFlags { 41 public static final int ACC_PUBLIC = 0x0001; // class, inner, field, method 42 public static final int ACC_PRIVATE = 0x0002; // inner, field, method 43 public static final int ACC_PROTECTED = 0x0004; // inner, field, method 44 public static final int ACC_STATIC = 0x0008; // inner, field, method 45 public static final int ACC_FINAL = 0x0010; // class, inner, field, method 46 public static final int ACC_SUPER = 0x0020; // class 47 public static final int ACC_SYNCHRONIZED = 0x0020; // method 48 public static final int ACC_VOLATILE = 0x0040; // field 49 public static final int ACC_BRIDGE = 0x0040; // method 50 public static final int ACC_TRANSIENT = 0x0080; // field 51 public static final int ACC_VARARGS = 0x0080; // method 52 public static final int ACC_NATIVE = 0x0100; // method 53 public static final int ACC_INTERFACE = 0x0200; // class, inner 54 public static final int ACC_ABSTRACT = 0x0400; // class, inner, method 55 public static final int ACC_STRICT = 0x0800; // method 56 public static final int ACC_SYNTHETIC = 0x1000; // class, inner, field, method 57 public static final int ACC_ANNOTATION = 0x2000; // class, inner 58 public static final int ACC_ENUM = 0x4000; // class, inner, field 59 public static final int ACC_MODULE = 0x8000; // class, inner, field, method 60 61 public static enum Kind { Class, InnerClass, Field, Method}; 62 63 AccessFlags(ClassReader cr) throws IOException { 64 this(cr.readUnsignedShort()); 65 } 66 67 public AccessFlags(int flags) { 68 this.flags = flags; 69 } 70 71 public AccessFlags ignore(int mask) { 72 return new AccessFlags(flags & ~mask); 73 } 74 75 public boolean is(int mask) { 76 return (flags & mask) != 0; 77 } 78 79 public int byteLength() { 80 return 2; 81 } 82 83 private static final int[] classModifiers = { 84 ACC_PUBLIC, ACC_FINAL, ACC_ABSTRACT, ACC_MODULE 85 }; 86 87 private static final int[] classFlags = { 88 ACC_PUBLIC, ACC_FINAL, ACC_SUPER, ACC_INTERFACE, ACC_ABSTRACT, 89 ACC_SYNTHETIC, ACC_ANNOTATION, ACC_ENUM, ACC_MODULE 90 }; 91 92 public Set<String> getClassModifiers() { 93 int f = ((flags & ACC_INTERFACE) != 0 ? flags & ~ACC_ABSTRACT : flags); 94 return getModifiers(f, classModifiers, Kind.Class); 95 } 96 97 public Set<String> getClassFlags() { 98 return getFlags(classFlags, Kind.Class); 99 } 100 101 private static final int[] innerClassModifiers = { 102 ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, 103 ACC_ABSTRACT, ACC_MODULE 104 }; 105 106 private static final int[] innerClassFlags = { 107 ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, ACC_SUPER, 108 ACC_INTERFACE, ACC_ABSTRACT, ACC_SYNTHETIC, ACC_ANNOTATION, ACC_ENUM, ACC_MODULE 109 }; 110 111 public Set<String> getInnerClassModifiers() { 112 int f = ((flags & ACC_INTERFACE) != 0 ? flags & ~ACC_ABSTRACT : flags); 113 return getModifiers(f, innerClassModifiers, Kind.InnerClass); 114 } 115 116 public Set<String> getInnerClassFlags() { 117 return getFlags(innerClassFlags, Kind.InnerClass); 118 } 119 120 private static final int[] fieldModifiers = { 121 ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, 122 ACC_VOLATILE, ACC_TRANSIENT, ACC_MODULE 123 }; 124 125 private static final int[] fieldFlags = { 126 ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, 127 ACC_VOLATILE, ACC_TRANSIENT, ACC_SYNTHETIC, ACC_ENUM, ACC_MODULE 128 }; 129 130 public Set<String> getFieldModifiers() { 131 return getModifiers(fieldModifiers, Kind.Field); 132 } 133 134 public Set<String> getFieldFlags() { 135 return getFlags(fieldFlags, Kind.Field); 136 } 137 138 private static final int[] methodModifiers = { 139 ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, 140 ACC_SYNCHRONIZED, ACC_NATIVE, ACC_ABSTRACT, ACC_STRICT, ACC_MODULE 141 }; 142 143 private static final int[] methodFlags = { 144 ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, 145 ACC_SYNCHRONIZED, ACC_BRIDGE, ACC_VARARGS, ACC_NATIVE, ACC_ABSTRACT, 146 ACC_STRICT, ACC_SYNTHETIC, ACC_MODULE 147 }; 148 149 public Set<String> getMethodModifiers() { 150 return getModifiers(methodModifiers, Kind.Method); 151 } 152 153 public Set<String> getMethodFlags() { 154 return getFlags(methodFlags, Kind.Method); 155 } 156 157 private Set<String> getModifiers(int[] modifierFlags, Kind t) { 158 return getModifiers(flags, modifierFlags, t); 159 } 160 161 private static Set<String> getModifiers(int flags, int[] modifierFlags, Kind t) { 162 Set<String> s = new LinkedHashSet<String>(); 163 for (int m: modifierFlags) { 164 if ((flags & m) != 0) 165 s.add(flagToModifier(m, t)); 166 } 191 case ACC_PRIVATE: 192 return "private"; 193 case ACC_PROTECTED: 194 return "protected"; 195 case ACC_STATIC: 196 return "static"; 197 case ACC_FINAL: 198 return "final"; 199 case ACC_SYNCHRONIZED: 200 return "synchronized"; 201 case 0x80: 202 return (t == Kind.Field ? "transient" : null); 203 case ACC_VOLATILE: 204 return "volatile"; 205 case ACC_NATIVE: 206 return "native"; 207 case ACC_ABSTRACT: 208 return "abstract"; 209 case ACC_STRICT: 210 return "strictfp"; 211 case ACC_MODULE: 212 return "module"; 213 default: 214 return null; 215 } 216 } 217 218 private static String flagToName(int flag, Kind t) { 219 switch (flag) { 220 case ACC_PUBLIC: 221 return "ACC_PUBLIC"; 222 case ACC_PRIVATE: 223 return "ACC_PRIVATE"; 224 case ACC_PROTECTED: 225 return "ACC_PROTECTED"; 226 case ACC_STATIC: 227 return "ACC_STATIC"; 228 case ACC_FINAL: 229 return "ACC_FINAL"; 230 case 0x20: 231 return (t == Kind.Class ? "ACC_SUPER" : "ACC_SYNCHRONIZED"); 232 case 0x40: 233 return (t == Kind.Field ? "ACC_VOLATILE" : "ACC_BRIDGE"); 234 case 0x80: 235 return (t == Kind.Field ? "ACC_TRANSIENT" : "ACC_VARARGS"); 236 case ACC_NATIVE: 237 return "ACC_NATIVE"; 238 case ACC_INTERFACE: 239 return "ACC_INTERFACE"; 240 case ACC_ABSTRACT: 241 return "ACC_ABSTRACT"; 242 case ACC_STRICT: 243 return "ACC_STRICT"; 244 case ACC_SYNTHETIC: 245 return "ACC_SYNTHETIC"; 246 case ACC_ANNOTATION: 247 return "ACC_ANNOTATION"; 248 case ACC_ENUM: 249 return "ACC_ENUM"; 250 case ACC_MODULE: 251 return "ACC_MODULE"; 252 default: 253 return null; 254 } 255 } 256 257 public final int flags; 258 } | 39 */ 40 public class AccessFlags { 41 public static final int ACC_PUBLIC = 0x0001; // class, inner, field, method 42 public static final int ACC_PRIVATE = 0x0002; // inner, field, method 43 public static final int ACC_PROTECTED = 0x0004; // inner, field, method 44 public static final int ACC_STATIC = 0x0008; // inner, field, method 45 public static final int ACC_FINAL = 0x0010; // class, inner, field, method 46 public static final int ACC_SUPER = 0x0020; // class 47 public static final int ACC_SYNCHRONIZED = 0x0020; // method 48 public static final int ACC_VOLATILE = 0x0040; // field 49 public static final int ACC_BRIDGE = 0x0040; // method 50 public static final int ACC_TRANSIENT = 0x0080; // field 51 public static final int ACC_VARARGS = 0x0080; // method 52 public static final int ACC_NATIVE = 0x0100; // method 53 public static final int ACC_INTERFACE = 0x0200; // class, inner 54 public static final int ACC_ABSTRACT = 0x0400; // class, inner, method 55 public static final int ACC_STRICT = 0x0800; // method 56 public static final int ACC_SYNTHETIC = 0x1000; // class, inner, field, method 57 public static final int ACC_ANNOTATION = 0x2000; // class, inner 58 public static final int ACC_ENUM = 0x4000; // class, inner, field 59 public static final int ACC_MANDATED = 0x8000; // class, inner, field, method 60 61 public static enum Kind { Class, InnerClass, Field, Method}; 62 63 AccessFlags(ClassReader cr) throws IOException { 64 this(cr.readUnsignedShort()); 65 } 66 67 public AccessFlags(int flags) { 68 this.flags = flags; 69 } 70 71 public AccessFlags ignore(int mask) { 72 return new AccessFlags(flags & ~mask); 73 } 74 75 public boolean is(int mask) { 76 return (flags & mask) != 0; 77 } 78 79 public int byteLength() { 80 return 2; 81 } 82 83 private static final int[] classModifiers = { 84 ACC_PUBLIC, ACC_FINAL, ACC_ABSTRACT 85 }; 86 87 private static final int[] classFlags = { 88 ACC_PUBLIC, ACC_FINAL, ACC_SUPER, ACC_INTERFACE, ACC_ABSTRACT, 89 ACC_SYNTHETIC, ACC_ANNOTATION, ACC_ENUM 90 }; 91 92 public Set<String> getClassModifiers() { 93 int f = ((flags & ACC_INTERFACE) != 0 ? flags & ~ACC_ABSTRACT : flags); 94 return getModifiers(f, classModifiers, Kind.Class); 95 } 96 97 public Set<String> getClassFlags() { 98 return getFlags(classFlags, Kind.Class); 99 } 100 101 private static final int[] innerClassModifiers = { 102 ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, 103 ACC_ABSTRACT 104 }; 105 106 private static final int[] innerClassFlags = { 107 ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, ACC_SUPER, 108 ACC_INTERFACE, ACC_ABSTRACT, ACC_SYNTHETIC, ACC_ANNOTATION, ACC_ENUM 109 }; 110 111 public Set<String> getInnerClassModifiers() { 112 int f = ((flags & ACC_INTERFACE) != 0 ? flags & ~ACC_ABSTRACT : flags); 113 return getModifiers(f, innerClassModifiers, Kind.InnerClass); 114 } 115 116 public Set<String> getInnerClassFlags() { 117 return getFlags(innerClassFlags, Kind.InnerClass); 118 } 119 120 private static final int[] fieldModifiers = { 121 ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, 122 ACC_VOLATILE, ACC_TRANSIENT 123 }; 124 125 private static final int[] fieldFlags = { 126 ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, 127 ACC_VOLATILE, ACC_TRANSIENT, ACC_SYNTHETIC, ACC_ENUM 128 }; 129 130 public Set<String> getFieldModifiers() { 131 return getModifiers(fieldModifiers, Kind.Field); 132 } 133 134 public Set<String> getFieldFlags() { 135 return getFlags(fieldFlags, Kind.Field); 136 } 137 138 private static final int[] methodModifiers = { 139 ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, 140 ACC_SYNCHRONIZED, ACC_NATIVE, ACC_ABSTRACT, ACC_STRICT 141 }; 142 143 private static final int[] methodFlags = { 144 ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, 145 ACC_SYNCHRONIZED, ACC_BRIDGE, ACC_VARARGS, ACC_NATIVE, ACC_ABSTRACT, 146 ACC_STRICT, ACC_SYNTHETIC 147 }; 148 149 public Set<String> getMethodModifiers() { 150 return getModifiers(methodModifiers, Kind.Method); 151 } 152 153 public Set<String> getMethodFlags() { 154 return getFlags(methodFlags, Kind.Method); 155 } 156 157 private Set<String> getModifiers(int[] modifierFlags, Kind t) { 158 return getModifiers(flags, modifierFlags, t); 159 } 160 161 private static Set<String> getModifiers(int flags, int[] modifierFlags, Kind t) { 162 Set<String> s = new LinkedHashSet<String>(); 163 for (int m: modifierFlags) { 164 if ((flags & m) != 0) 165 s.add(flagToModifier(m, t)); 166 } 191 case ACC_PRIVATE: 192 return "private"; 193 case ACC_PROTECTED: 194 return "protected"; 195 case ACC_STATIC: 196 return "static"; 197 case ACC_FINAL: 198 return "final"; 199 case ACC_SYNCHRONIZED: 200 return "synchronized"; 201 case 0x80: 202 return (t == Kind.Field ? "transient" : null); 203 case ACC_VOLATILE: 204 return "volatile"; 205 case ACC_NATIVE: 206 return "native"; 207 case ACC_ABSTRACT: 208 return "abstract"; 209 case ACC_STRICT: 210 return "strictfp"; 211 case ACC_MANDATED: 212 return "mandated"; 213 default: 214 return null; 215 } 216 } 217 218 private static String flagToName(int flag, Kind t) { 219 switch (flag) { 220 case ACC_PUBLIC: 221 return "ACC_PUBLIC"; 222 case ACC_PRIVATE: 223 return "ACC_PRIVATE"; 224 case ACC_PROTECTED: 225 return "ACC_PROTECTED"; 226 case ACC_STATIC: 227 return "ACC_STATIC"; 228 case ACC_FINAL: 229 return "ACC_FINAL"; 230 case 0x20: 231 return (t == Kind.Class ? "ACC_SUPER" : "ACC_SYNCHRONIZED"); 232 case 0x40: 233 return (t == Kind.Field ? "ACC_VOLATILE" : "ACC_BRIDGE"); 234 case 0x80: 235 return (t == Kind.Field ? "ACC_TRANSIENT" : "ACC_VARARGS"); 236 case ACC_NATIVE: 237 return "ACC_NATIVE"; 238 case ACC_INTERFACE: 239 return "ACC_INTERFACE"; 240 case ACC_ABSTRACT: 241 return "ACC_ABSTRACT"; 242 case ACC_STRICT: 243 return "ACC_STRICT"; 244 case ACC_SYNTHETIC: 245 return "ACC_SYNTHETIC"; 246 case ACC_ANNOTATION: 247 return "ACC_ANNOTATION"; 248 case ACC_ENUM: 249 return "ACC_ENUM"; 250 case ACC_MANDATED: 251 return "ACC_MANDATED"; 252 default: 253 return null; 254 } 255 } 256 257 public final int flags; 258 } |