Java通过反射获取Method方法

1. 创建GFather祖先类,Father父类并且继承GFather类,Son子类并且继承父类。

package reflection.commen;

public class GFather {
    public int g_age = 1;
    public String g_name = "爷爷";

    public GFather(){

    }
    public GFather(int age, String name) {
        this.g_age = age;
        this.g_name = name;
    }

    public int getG_age() {
        return g_age;
    }

    private void setG_age(int g_age) {
        this.g_age = g_age;
    }
}

package reflection.commen;

public class Father extends GFather {
    private int f_age;
    public String f_name;
    public Father(){

    }
    public Father(int father_age, String father_name) {
        super();
        this.f_age = father_age;
        this.f_name = father_name;
    }

    public int getF_age() {
        return f_age;
    }

    private void setF_age(int f_age) {
        this.f_age = f_age;
    }
}

package reflection.commen;

import reflection.commen.Father;

public class Son extends Father {

    private int s_age;
    public String s_name;

    public Son(){

    }
    public Son(int son_age, String son_name, int f_age, String f_name) {
        super(f_age,f_name);
        this.s_age = son_age;
        this.s_name = son_name;
    }

    public int getS_age() {
        return s_age;
    }

    private void setS_age(int s_age) {
        this.s_age = s_age;
    }
    
}

2. getDeclaredMethod(String name, Class<?>… parameterTypes)获取本类定义定义的方法,传入的参数是方法名 + 反射出的方法的形参类型。该方法只能获取本类的所有方法,不能获取祖先类的。

@Test
public void test1() throws Exception{
     Son son = new Son(3,"儿子",2,"父亲");
     Method set = Class.forName("reflection.commen.Son").getDeclaredMethod("setS_age", int.class);			//setS_age(int age)     所以第二个参数是int.class
     Method get = Class.forName("reflection.commen.Son").getDeclaredMethod("getS_age");
     set.setAccessible(true);
     set.invoke(son,100);
     System.out.println(get.invoke(son));
 }

在这里插入图片描述

3. getMethod(String name, Class<?>… parameterTypes)获取本类定义定义的方法,传入的参数是方法名 + 反射出的方法的形参类型。只能获取所有的public方法

 @Test
    public void test2() throws Exception{
        Son son = new Son(3,"儿子",2,"父亲");
        Method gets = Class.forName("reflection.commen.Son").getMethod("getS_age");
        Method getf = Class.forName("reflection.commen.Son").getMethod("getF_age");
        Method getg = Class.forName("reflection.commen.Son").getMethod("getG_age");
        System.out.println(gets.getName() + " -> " + gets.invoke(son));
        System.out.println(getf.getName() + " -> " + getf.invoke(son));
        System.out.println(getg.getName() + " -> " + getg.invoke(son));

        Method sets = Class.forName("reflection.commen.Son").getMethod("setS_age",int.class);
        sets.setAccessible(true);
        sets.invoke(son,50);               //修改s_age = 50;
        System.out.println(gets.getName() + " -> " + gets.invoke(son));
    }

在这里插入图片描述

4. getDeclaredMethods()获取本类所有的方法,注意区分不同方法需要传入的参数类型。否则会出现异常问题。

@Test
public void test3() throws Exception{
    Son son = new Son(3,"儿子",2,"父亲");
    Method[] methods = Class.forName("reflection.commen.Son").getDeclaredMethods();

    for(Method m : methods){
        m.setAccessible(true);
        if(m.getName().equals("setS_age")){			//区分不同函数
            m.invoke(son,50);				//设置s_age = 50
        }
        else{
            m.invoke(son);
        }
        System.out.println(m.getName());
    }
}

在这里插入图片描述

5. getMethods()方法获取子类 + 父类所有的public方法,并且由于所有类的老祖宗都是Object类,因此获得的方法包括object超类的方法。

@Test
public void test4() throws Exception{
    Son son = new Son(3,"儿子",2,"父亲");
    Method[] methods = Class.forName("reflection.commen.Son").getMethods();
    System.out.println(methods.length);
    for(Method m : methods){
        System.out.println(m.toString());
    }
}

在这里插入图片描述

6. 这里并没有static方法的调用过程,由于static方法比较特殊是一个静态方法,在使用invoke调用的时候不需要传入对象,因为static方法不属于任何一个实例化对象。