這裏主要講解獲取運行時類的特定的屬性和類的特定的方法:
獲取運行時類的對象的屬性:
getFields方法和getDeclardFields
結果:
對於獲取到的屬性的賦值:通過get和set方法
- 在Field中:
- public Object get(Object obj) 取得指定對象obj上此Field的屬性內容
- public void set(Object obj,Object value) 設置指定對象obj上此Field的屬性內容
注意:
person中我們對於私有的屬性age的獲取,我們是無法直接對age進行set和get的操作。
注:在類中屬性都設置爲private的前提下,在使用set()和get()方法時,首先要使用Field類中的setAccessible(true)方法將需要操作的屬性設置爲可以被外部訪問。
publicvoid setAccessible(true)訪問私有屬性時,讓這個屬性可見。
本來age是person的私有屬性,這是類的封裝性(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[] args爲null
4.若原方法聲明爲private,則需要在調用此invoke()方法前,顯式調用方法對象的setAccessible(true)方法,將可訪問private的方法
結果:
我們在前面強調的運行時類是反射的基礎。在這裏應該可以體會出來了吧。如果沒有運行時類,我們的這行屬性,方法就沒有辦法獲取。