1. 程式人生 > >6、獲取Class中的方法

6、獲取Class中的方法

6、獲取Class中的方法

6.1 getMethods() 獲取的都是共有的方法(包括父類)

  • 返回包含一個數組 方法物件反射由此表示的類或介面的所有公共方法 類物件,包括那些由類或介面和那些從超類和超介面繼承的宣告。
  • 如果此類物件表示具有多個具有相同名稱和引數型別但具有不同返回型別的公共方法的型別,則返回的陣列對於每個此類方法都有一個方法物件。
  • 如果此類物件表示與類初始化方法的型別
  • 如果此類物件表示一個數組型別,則返回的陣列具有方法對於每個由陣列型別從繼承的公共方法物件Object 。 它不包含方法物件clone() 。
  • 如果此類物件表示一個介面,那麼返回的陣列不包含任何隱含宣告的方法,從Object 。因此,如果在此介面或其任何超級介面中沒有顯式宣告方法,則返回的陣列的長度為0.(注意,表示類的類物件始終具有從Object公共方法)。
  • 如果此類物件表示原始型別或空值,則返回的陣列的長度為0。
  • 由此類物件表示的類或介面的超級介面中宣告的靜態方法不被視為類或介面的成員。
  • 返回的陣列中的元素不會被排序,並且不是以任何特定的順序。
/**
 * 獲取指定Class中的公共函式
 */
@Test
public void getMethodDemo() throws Exception {
    Class clazz = Class.forName("com.hw.bean.Person");
    Method[] methods = clazz.getMethods();
    for (Method method : methods) {
        System.out.println(method);
    }
}

執行:

6.2 getDeclaredMethods() 獲取本類中的所有的方法(包含私有的)

  • 返回包含一個數組方法物件反射的類或介面的所有宣告的方法,通過此表示類物件,包括公共,保護,預設(包)訪問和私有方法,但不包括繼承的方法。
  • 如果此類物件表示具有多個具有相同名稱和引數型別但具有不同返回型別的宣告方法的型別,則返回的陣列對於每個此類方法都有一個方法物件。
  • 如果此類物件表示具有類初始化方法的型別
  • 如果此類物件表示沒有宣告方法的類或介面,則返回的陣列的長度為0。
  • 如果這個類物件表示一個數組型別,一個基本型別,或者是void,則返回的陣列的長度為0。
  • 返回的陣列中的元素不會被排序,並且不是以任何特定的順序。
@Test
public void getMethodDemo_2() throws Exception {
    Class clazz = Class.forName("com.hw.bean.Person");
    Method[] methods = clazz.getDeclaredMethods();
    for (Method method : methods) {
        System.out.println(method);
    }
}

執行:

6.3 getMethod(String name, 類<?>... parameterTypes) 獲取單個方法

  • 返回一個方法物件,它反映此表示的類或介面的指定公共成員方法類物件。
  • name引數是一個String它指定了所需方法的簡單名稱。
  • parameterTypes引數是以宣告順序標識方法的形式引數型別的類物件的陣列。
  • 如果parameterTypes是null ,它被視為一個空陣列。
6.3.1 方法無參 方式一:使用無參構造器(預設) method.invoke(o, null)
@Test
public void getMethodDemo_3() throws Exception {
    Class clazz = Class.forName("com.hw.bean.Person");
    // 獲取空參的一般方法
    Method method = clazz.getMethod("show", null);
    Object o = clazz.newInstance();
    method.invoke(o, null);
    System.out.println(method);
}

執行:

6.3.2 方法無參 方式二:使用有參構造器 method.invoke(o, null)
@Test
public void getMethodDemo_4() throws Exception {
    Class clazz = Class.forName("com.hw.bean.Person");
    // 獲取空參的一般方法
    Method method = clazz.getMethod("show", null);
    // 獲取帶參構造器
    Constructor constructor = clazz.getConstructor(String.class, int.class);
    Object o = constructor.newInstance("小明", 12);
    method.invoke(o, null);
    System.out.println(method);
}

執行:

6.3.3 方法有參
@Test
public void getMethodDemo_5() throws Exception {
    Class clazz = Class.forName("com.hw.bean.Person");
    Method method = clazz.getMethod("paramMethod", String.class, int.class);
    // 獲取帶參構造器
    Constructor constructor = clazz.getConstructor(String.class, int.class);
    Object o = constructor.newInstance("小明", 12);
    method.invoke(o, "張三", 18);
    System.out.println(method);
}

執行:


本章節原始碼: ReflectDemo4