getModifiers()的Java Doc如下:
int getModifiers()以整数形式返回此Member表示的成员或构造函数的Java语言修饰符 . 应使用Modifier类来解码整数中的修饰符 .
和Java Docs也提供list of different modifiers and their corresponding int values:
public static final int ABSTRACT 1024 public static final int FINAL 16 public static final int INTERFACE 512 public static final int NATIVE 256 public static final int PRIVATE 2 public static final int PROTECTED 4 public static final int PUBLIC 1 public static final int STATIC 8 public static final int STRICT 2048 public static final int SYNCHRONIZED 32 public static final int TRANSIENT 128 public static final int VOLATILE 64
对于单个修饰符,getModifiers()非常简单 . 它只返回对应于修饰符的常量值(例如,当我将一个类声明为 public final 并调用getModifiers()时,它返回 17 ) .
System.out.println("modifierValue:" + MyClass.class.getModifiers());
输出是:
17
但是,我不太明白它如何适用于多个修饰符 . 任何人都可以开导我吗?
1 回答
TL; DR:它将它们加在一起形成一个位字段 .
要理解这一点,你需要了解二进制如何工作,这类似于十进制 - 让我们从那里开始:
那么
101
是什么意思呢?它必须是public final
,因为除了单个100
和单个1
之外,十进制系统中没有其他方法可以生成"one hundred and one" .现在将其扩展为二进制:
那么
9
是什么意思呢?好吧,与十进制系统一样,只有一种(正确的)方法可以使二进制9
- 一个8
和一个1
.现在我们使用我们称之为bitfield的东西,_210781_在二进制文件中是:
要验证, write some code !
现在,使用十进制系统,我们将重复除以
10
并检查最右边的数字(最不重要) . 对于二进制,这个过程是相同的,除了我们除以2
- 这被称为位移 .输出:
所以,如果我知道
private
是21的值,并且我们知道我们有多少位,那么只需要移位正确的位数并使用2
模数:输出:
所以我们基本上使用组成二进制数的
1
和0
值来编号来存储布尔值 .所以把这个例子带入阅读世界:
输出:
所以我们可以看到我们有:
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