java 反射是一種經常使用的技術手段, 經過加載類的字節碼的方式來獲取相關類的一些信息 好比成員變量, 成員方法等。java
Field 是什麼呢?數組
field 是一個類, 位於java.lang.reflect包下。 在java 的反射中field 類描述的是類的屬性信息 功能包括:安全
1: 獲取當前對象的成員變量的類型spa
2: 對成員變量從新設置值對象
如何使用field 呢?繼承
四種方法 獲取到field 類對象接口
1: Class.getFields() 獲取類中public 類型的屬性, 返回一個包含某些field對象的數組, 該數組包含此Class對象所表示的類或接口的全部可訪問公共字段get
2: getDeclaredFields() 獲取類中全部屬性(public protect default private) , 可是不包括繼承的屬性, 返回field對象的一個數組編譯器
3: getField(String name) 獲取類特定的方法,name 參數指定了屬性的名稱io
4: getDeclaredField(String name) 獲取類特定的方法, name 參數指定了屬性的名稱
Field 對象經常使用方法
獲取變量的類型
Field.getType(): 返回這個變量的類型
Field.getGenericType: 若是當前屬性有簽名屬性類型就返回, 不然就返回 Field.getType()
isEnumConstant(): 判斷這個屬性是不是枚舉類
獲取成員變量的修飾符
Field.getModifiers() 以整數形式返回此 Field 對象標識的字段的java 語言修飾符
獲取和修改爲員變量的值
getName(): 獲取屬性的名字
get(Object obj): 返回指定對象obj上此field表示的字段值
set(Object obj, Object value) 將指定對象變量上此field 對象表示的字段設置爲指定的新值
常見錯誤
set(Object obj, Object value)時, 新value 和原 value 的類型不一致就會致使類型轉換異常【反射獲取或者修改一個變量的值時, 編譯器不會再自動拆裝箱, 一些類型轉換須要本身手動完成】
set(Object obj, Object value)時, 修改final類型的變量致使的類型轉換異常。因爲Field繼承自AccessibleObject, 咱們可使用AccessibleObject.setAccessible() 方法告訴安全機制,這個變量能夠訪問
便可解決, 如 field.setAccessible(true).
getField(String name) 或 getField() 獲取非public的變量, 編譯器會報 java.lang.NoSuchFieldException的錯