修饰器 Modifier
Java 中常见的修饰器:public、private、protected、static、final、…等等。
Java中的属性、方法、构造器、内部类等等都需要使用修饰器进行修饰,所以通过反射可以获取对应的Field对象、Method对象、等等。
Modifier的源码:
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 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
| package java.lang.reflect;
import java.security.AccessController; import sun.reflect.ReflectionFactory; import sun.reflect.ReflectionFactory.GetReflectionFactoryAction;
public class Modifier { public static final int PUBLIC = 1; public static final int PRIVATE = 2; public static final int PROTECTED = 4; public static final int STATIC = 8; public static final int FINAL = 16; public static final int SYNCHRONIZED = 32; public static final int VOLATILE = 64; public static final int TRANSIENT = 128; public static final int NATIVE = 256; public static final int INTERFACE = 512; public static final int ABSTRACT = 1024; public static final int STRICT = 2048; static final int BRIDGE = 64; static final int VARARGS = 128; static final int SYNTHETIC = 4096; static final int ANNOTATION = 8192; static final int ENUM = 16384; static final int MANDATED = 32768; private static final int CLASS_MODIFIERS = 3103; private static final int INTERFACE_MODIFIERS = 3087; private static final int CONSTRUCTOR_MODIFIERS = 7; private static final int METHOD_MODIFIERS = 3391; private static final int FIELD_MODIFIERS = 223; private static final int PARAMETER_MODIFIERS = 16; static final int ACCESS_MODIFIERS = 7;
public Modifier() { }
public static boolean isPublic(int var0) { return (var0 & 1) != 0; }
public static boolean isPrivate(int var0) { return (var0 & 2) != 0; }
public static boolean isProtected(int var0) { return (var0 & 4) != 0; }
public static boolean isStatic(int var0) { return (var0 & 8) != 0; }
public static boolean isFinal(int var0) { return (var0 & 16) != 0; }
public static boolean isSynchronized(int var0) { return (var0 & 32) != 0; }
public static boolean isVolatile(int var0) { return (var0 & 64) != 0; }
public static boolean isTransient(int var0) { return (var0 & 128) != 0; }
public static boolean isNative(int var0) { return (var0 & 256) != 0; }
public static boolean isInterface(int var0) { return (var0 & 512) != 0; }
public static boolean isAbstract(int var0) { return (var0 & 1024) != 0; }
public static boolean isStrict(int var0) { return (var0 & 2048) != 0; }
static boolean isSynthetic(int var0) { return (var0 & 4096) != 0; }
static boolean isMandated(int var0) { return (var0 & '耀') != 0; }
public static int classModifiers() { return 3103; }
public static int interfaceModifiers() { return 3087; }
public static int constructorModifiers() { return 7; }
public static int methodModifiers() { return 3391; }
public static int fieldModifiers() { return 223; }
public static int parameterModifiers() { return 16; } ... }
|
从源码可以看出,修饰器中的针对公共常量的处理采用了二进制枚举的思想。
Java实例中的属性或者方法的修饰器都由JVM控制,在其对应的Field对象、Method对象、Constructor对象等等,其内部都维护了一个private int modifiers;
属性值,用于记录修饰器的类型。
根据二进制枚举的思想,将所有的修饰器的值都累加到modifiers
属性值上,判断是否包含某种修饰器时,也是通过位运算实现,效率极高。
二进制枚举请见博文:二进制枚举/位枚举