Reflection--獲取運行時類的指定信息

   這裏主要講解獲取運行時類的特定的屬性和類的特定的方法:

獲取運行時類的對象的屬性:

getFields方法和getDeclardFields


結果:


對於獲取到的屬性的賦值:通過getset方法

  • Field中:
  • public Object get(Object obj) 取得指定對象obj上此Field的屬性內容
  • public void set(Object obj,Object value) 設置指定對象obj上此Field的屬性內容

注意:

person中我們對於私有的屬性age的獲取,我們是無法直接對age進行setget的操作。

注:在類中屬性都設置爲private的前提下,在使用set()和get()方法時,首先要使用Field類中的setAccessible(true)方法將需要操作的屬性設置爲可以被外部訪問。

publicvoid setAccessible(true)訪問私有屬性時,讓這個屬性可見。

本來ageperson的私有屬性,這是類的封裝性(Public,private),但是現在我們打破了類的封裝性。


通過反射調用類中指定的方法:

通過反射,調用類中的方法,通過Method類完成。步驟:

1.通過Class類的getMethod(Stringname,Class…parameterTypes)方法取得一個Method對象,並設置此方法操作時所需要的參數類型。這個是獲取運行時類中聲明爲public的方法。

2.之後使用Object invoke(Object obj, Object[] args)進行調用,並向方法中傳遞要設置的obj對象的參數信息

Invoke()說明:

說明:

    1.Object 對應原方法的返回值,若原方法無返回值,此時返回null

    2.若原方法若爲靜態方法,此時形參Object obj可爲null

    3.若原方法形參列表爲空,則Object[] argsnull

    4.若原方法聲明爲private,則需要在調用此invoke()方法前,顯式調用方法對象的setAccessible(true)方法,將可訪問private的方法


結果:


    我們在前面強調的運行時類是反射的基礎。在這裏應該可以體會出來了吧。如果沒有運行時類,我們的這行屬性,方法就沒有辦法獲取。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章