java 反射是一種常用的技術手段, 通過加載類的字節碼的方式來獲取相關類的一些信息 比如成員變量, 成員方法等。
Field 是什么呢?
field 是一個類, 位於java.lang.reflect包下。 在java 的反射中field 類描述的是類的屬性信息 功能包括:
1: 獲取當前對象的成員變量的類型
2: 對成員變量重新設置值
如何使用field 呢?
四種方法 獲取到field 類對象
1: Class.getFields() 獲取類中public 類型的屬性, 返回一個包含某些field對象的數組, 該數組包含此Class對象所表示的類或接口的所有可訪問公共字段
2: getDeclaredFields() 獲取類中所有屬性(public protect default private) , 但是不包括繼承的屬性, 返回field對象的一個數組
3: getField(String name) 獲取類特定的方法,name 參數指定了屬性的名稱
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的錯