Java反射之調用方法

通過反射機制還可以調用方法,這與調用構造方法類似。調用方法需要使用Method對象,它對應着一 個方法,獲得Method對象需要使用Class類的如下方法:

  • Method[] getMethods():返回所有公有方法Method對象數組。
  • Method[] getDeclaredMethods():返回所有方法Method對象數組。
  • Method getMethod(String name, Class… parameterTypes):通過方法名和參數類型返回公有方法 Method對象。參數parameterTypes是Class數組,指定方法的參數列表。
  • Method getDeclaredMethod(String name, Class… parameterTypes):通過方法名和參數類型返回方 法Method對象。參數parameterTypes同上。

現有一個Person類:

public class Person {
    public String name;
    public int age;

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getAge() {
        return age;
    }

    public void setNameAndAge(String name,int age){
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

現在編寫一個程序通過反射機制調用Person類setNameAndAge和getName方法,具體代碼如下:

import java.lang.reflect.Method;

public class HelloWorld {
    public static void main(String[] args) {
        try{
            Class clz = Class.forName("Java反射機制.調用方法.Person");

//            調用默認構造方法
            Person person = (Person) clz.newInstance();
            System.out.println(person);

//            1.指定參數類型
            Class[] params = new Class[2];
//            第一個參數是String
            params[0] = String.class;
//            第二個參數是int
            params[1] = int.class;

//           2.獲取setNameAndAge方法對象
            Method method = clz.getMethod("setNameAndAge",params);

//            3。設置傳遞參數
            Object[] argObjs = new Object[2];
//            第一個參數傳遞Tony
            argObjs[0] = "Tony";
//            第二個參數傳遞21
            argObjs[1] = 21;

//            4.調用setNameAndAge方法,person是要調用的對象,argObjs是設置要傳遞的參數值
            method.invoke(person,argObjs);
            System.out.println(person);

//            獲取getName方法對象,該方法沒有參數
            method = clz.getMethod("getName");
//            調用getName方法
            Object result = method.invoke(person);
            System.out.println(result);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

運行結果:

Person{name='null', age=0}
Person{name='Tony', age=21}
Tony

以上內容僅供參考學習,如有侵權請聯繫我刪除!
如果這篇文章對您有幫助,左下角的大拇指就是對博主最大的鼓勵。
您的鼓勵就是博主最大的動力!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章