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

所以我们基本上使用10值来组成二进制数字来存储布尔值。

所以把这个例子带入阅读世界:

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

链接地址: http://www.djcxy.com/p/35389.html

上一篇: How does the getModifiers() method calculate the value for multiple modifiers?

下一篇: group instances not running tasks in parallel