此篇緊接《將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