一、調用指定方法
通過反射,調用類中的方法,通過Method類完成。步驟:
1、通過Class類的getMethod(String name,Class…parameterTypes)方法取得一個Method對象,並設置此方法操作時所需要的參數類型。
2、使用Object invoke(Object obj,Object[ ] args)進行調用,並向方法中傳遞要設置的obj對象的參數信息。
說明:
1.Object 對應原方法的返回值,若原方法無返回值,此時返回null
2.若原方法若爲靜態方法,此時形參Object obj可爲null
3.若原方法形參列表爲空,則Object[] args爲null
4.若原方法聲明爲private,則需要在調用此invoke()方法前,顯式調用方法對象的setAccessible(true)方法,將可訪問private的方法。
/**
* 調用運行時類中指定的方法
*/
@Test
public void test3() throws Exception {
//1、創建運行時類
Class clazz = Person.class;
//2、創建Method對象
Method m1 = clazz.getMethod("show");
//3、創建運行時類所對應的對象
Person p = (Person) clazz.newInstance();
//4、調用方法
m1.invoke(p);
//私有方法
Method m2 = clazz.getDeclaredMethod("display", String.class);
m2.setAccessible(true);
m2.invoke(p,"中國");
}
構造器
/**
* 調用指定類型的構造器創建對象
*/
@Test
public void test4() throws Exception {
String className = "Progress.reflection.Person";
Class clazz = Class.forName(className);
//private修飾的構造器
Constructor con = clazz.getDeclaredConstructor(String.class, Integer.class);
con.setAccessible(true);
Person p = (Person) con.newInstance("小汐",34);
System.out.println(p);
}
二、調用指定屬性以及賦值
在反射機制中,可以直接通過Field類操作類中的屬性,通過Field類提供的set( )和get( )方法就可以完成設置和取得屬性類容的操作。
-
public Field getField(String name);返回此Class對象表示的類或接口的指定的public的Field
-
public Field getDeclareField(String name);返回此對象表示的類或接口的指定的Field。
在Field中: -
public Object get(Object obj); 取得指定對象obj上此Field的屬性內容。
-
public void set(Object obj,Object value); 設置指定對象obj上此Field的屬性內容。
注:在類中屬性都設置爲private的情況下,在使用set和get方法時,首先要使用Field類中的setAccessible(true)方法將需要操作的屬性設置爲可以被外部訪問。 -
public void setAccessible(true);訪問私有屬性時,讓這個屬性可見。
/**
* 調用運行時類中指定的屬性
*/
@Test
public void test3() throws Exception {
Class clazz = Person.class;
//1、獲取指定的屬性
//getField:這種寫法是類的屬性範圍設置爲public
Field name = clazz.getField("name");
//2、創建運行時類的對象
Person p = (Person) clazz.newInstance();
//3、將運行時類的指定的屬性賦值
name.set(p,"jerry");
//getDeclaredField: 這種寫法是類的屬性範圍設置爲private
Field age = clazz.getDeclaredField("age");
age.setAccessible(true);
age.set(p,34);
System.out.println(p);
}