修饰器 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属性值上,判断是否包含某种修饰器时,也是通过位运算实现,效率极高。

二进制枚举请见博文:二进制枚举/位枚举