getModifiers()方法如何计算多个修饰符的值?
getModifiers()的Java Doc如下所示:
int getModifiers()
以整数形式返回此Member所表示的成员或构造函数的Java语言修饰符。 修饰符类应该用于解码整数中的修饰符。
Java Docs还提供了不同修饰符及其对应的int值列表:
public static final int ABSTRACT 1024
公共静态最终诠释16
公共静态最终int INTERFACE 512
public static final int NATIVE 256
公共静态最终诠释私人2
公共静态最终int保护4
public static final int PUBLIC 1
公共静态最终int STATIC 8
public static final int STRICT 2048
公共静态最终诠释SYNCHRONIZED 32
公共静态最终int TRANSIENT 128
public static final int VOLATILE 64
对于单个修改器,getModifiers()非常简单。 它只是返回与修饰符对应的常量值(例如,当我将一个类声明为public final并调用getModifiers()时,它将返回17 )。
System.out.println("modifierValue:" + MyClass.class.getModifiers());
输出是:
17
但是,我不能完全理解它是如何用于多个修饰符的。 任何人都可以启发我吗?
TL; DR:它将它们加在一起形成一个位域。
要理解这一点,你需要了解二进制的工作方式,这与十进制类似 - 让我们从这里开始:
1 - public
10 - static
100 - final
那么, 101
是什么意思? 它必须是public final
因为在十进制系统中除了单个100
和一个1
之外没有别的方法来制造“一百一十”。
现在将其扩展为二进制:
1 - public
2 - private
4 - protected
8 - static
那么9
是什么意思? 那么,就像十进制系统一样,只有一种(正确的)方法可以使二进制数为9
- 一个8
和一个1
。
现在我们使用我们所说的位域,二进制中的9
是:
1001
为了验证, 编写一些代码 !
public static void main(String[] args) throws Exception {
int i = 9;
System.out.println(Integer.toBinaryString(i));
}
现在,使用十进制系统,我们会反复除以10
,并检查最右边的数字(最不重要)。 对于二进制,这个过程是相同的,除了我们除以2
- 这就是所谓的位移。
public static void main(String[] args) throws Exception {
int i = 9;
System.out.println(Integer.toBinaryString(i));
i >>= 1;
System.out.println(Integer.toBinaryString(i));
i >>= 1;
System.out.println(Integer.toBinaryString(i));
i >>= 1;
System.out.println(Integer.toBinaryString(i));
}
输出:
1001
100
10
1
所以,如果我知道private
是21的值,并且我们知道我们有多少bit,那么只需要移动正确的数字位数并以2
:
public static void main(String[] args) throws Exception {
int i = 9;
i >>= 2;
System.out.println(i%2);
}
输出:
0
所以我们基本上使用1
和0
值来组成二进制数字来存储布尔值。
所以把这个例子带入阅读世界:
public static void main(String[] args) throws Exception {
final Method method = App.class.getMethod("myMethod");
final int modifiers = method.getModifiers();
System.out.println(modifiers);
System.out.println(Integer.toBinaryString(modifiers));
}
public strictfp synchronized static final void myMethod() {
}
输出:
2105
100000111001
所以我们可以看到我们有:
20 = 1 - true
21 = 2 - false
22 = 4 - false
23 = 8 - true
24 = 16 - true
25 = 32 - true
27 = 64 - false
28 = 128 - false
29 = 256 - false
210 = 512 - false
211 = 1024 - false
212 = 2048 - true
上一篇: How does the getModifiers() method calculate the value for multiple modifiers?