反射_通過反射調用類中指定方法、屬性

一、調用指定方法

通過反射,調用類中的方法,通過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);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章