論 f.getModifiers() & Modifier.FINAL &Modifier.STATIC 如何成立

此篇緊接《將HttpServletRequest中的參數反射至實體類》文:

如果&、|、&&、||沒弄清楚的同學,請戳這裏!

首先在《API之家》中查詢關於java.lang.reflect.Field的資料,如下:
http://www.apihome.cn/api/java/Field.html
其實關鍵在於getModifiers方法,API中是這樣寫的:
getModifiers() :以整數形式返回由此 Field 對象表示的字段的 Java 語言修飾符。
這裏的整數形式就來源於:java.lang.reflect.Modifier
我截取了最常用的4個(PUBLIC、PRIVATE、PROTECTED、STATIC、FINAL),如下(十六進制)

    public static final int PUBLIC           = 0x00000001;
    public static final int PRIVATE          = 0x00000002;   
    public static final int PROTECTED        = 0x00000004;  
    public static final int STATIC           = 0x00000008;  
    public static final int FINAL            = 0x00000010;

轉爲十進制會更容易理解一些,如下:

    //0x00000001(十六進制) = 1(十進制)
    public static final int PUBLIC           = 1;
    //0x00000002(十六進制) = 2(十進制)
    public static final int PRIVATE          = 2;   
    //0x00000004(十六進制) = 4(十進制)
    public static final int PROTECTED        = 4;  
    //0x00000008(十六進制) = 8(十進制)
    public static final int STATIC           = 8;  
    //0x00000010(十六進制) = 16(十進制)
    public static final int FINAL            = 16;

我新增了一個VO來存儲4種不同的屬性:
1. private static final 修飾
2. private static 修飾
3. public final 修飾
4. private 修飾

運行結果如下:
1. private static final 修飾:

與final修飾判斷
f.getModifiers()值:
11010 == 26(注:private:2+static:8+final:16 = 26)
Modifier.FINAL的值:
10000 == 16


結果:10000 == 16

與static修飾判斷
f.getModifiers()值:
11010 == 26(注:private:2+static:8+final:16 = 26)
Modifier.STATIC的值:
01000 == 8


結果:01000 == 8

2. private static 修飾:

與final修飾判斷
f.getModifiers()值:
01010 == 10(注:private:2+static:8 = 10)
Modifier.FINAL的值:
10000 == 16


結果:00000 == 0

與static修飾判斷
f.getModifiers()值:
01010 == 10(注:private:2+static:8 = 10)
Modifier.STATIC的值:
01000 == 8


結果:01000 == 8

3. public final 修飾:

與final修飾判斷
f.getModifiers()值:
10001 == 17(注:private:1+final:16 = 17)
Modifier.FINAL的值:
10000 == 16


結果:10000 == 16

與static修飾判斷
f.getModifiers()值:
10001 == 17(注:private:1+final:16 = 17)
Modifier.STATIC的值:
01000 == 8


結果:00000 == 0

4. private 修飾:

與final修飾判斷
f.getModifiers()值:
00010 == 2(注:private:2)
Modifier.FINAL的值:
10000 == 16


結果:00000 == 0

與static修飾判斷
f.getModifiers()值:
00010 == 2(注:private:2)
Modifier.STATIC的值:
01000 == 8


結果:00000 == 0

結論:
很明顯的可以看出在運行中整個執行過程,已經很清晰明瞭,唯一不同的是,在java.lang.reflect.Modifier中的修飾int值存在多個並存的情況時,比如上述中的 private static final 的f.getModifiers()值:返回的是十進制26(是一個累加的過程),轉換二進制爲:11010 ,第一位是1,這樣就既然滿足了Modifier.FINAL的值:10000 == 16,也滿足了Modifier.STATIC的值:01000 == 8

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章