java反射-- Field 用法實踐


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM