java反射-- Field 用法實踐

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的錯

相關文章
相關標籤/搜索