首页 文章

getModifiers()方法如何计算多个修饰符的值?

提问于
浏览
4

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 回答

  • 11

    TL; DR:它将它们加在一起形成一个位字段 .

    要理解这一点,你需要了解二进制如何工作,这类似于十进制 - 让我们从那里开始:

    1    - public
     10   - static
     100  - final
    

    那么 101 是什么意思呢?它必须是 public final ,因为除了单个 100 和单个 1 之外,十进制系统中没有其他方法可以生成"one hundred and one" .

    现在将其扩展为二进制:

    1 - public
    2 - private
    4 - protected
    8 - static
    

    那么 9 是什么意思呢?好吧,与十进制系统一样,只有一种(正确的)方法可以使二进制 9 - 一个 8 和一个 1 .

    现在我们使用我们称之为bitfield的东西,_210781_在二进制文件中是:

    1001
    

    要验证, write some code

    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的值,并且我们知道我们有多少位,那么只需要移位正确的位数并使用 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

相关问题