Java動態調用方法

public void function(String str) {  
    //根據 str的值 調用相應的方法  
}  
public void test() {  
    //code  
}

如str的值爲test,就調用test方法。主要用到java反射機制,Class和Method這些類。java

動態調用的方法:a.getClass().getMethod(str, new Class[]{}).invoke(a, new Object[]{})code

其中,a爲類的對象,str爲要被調用的方法名對象

  1. a.getClass()獲得a.class對象字符串

  2. getMethod(str, new Class[]{})獲得a對象中名爲str的不帶參數的方法。若是str方法帶參數如str(String s, int i),就要這樣寫getMethod(str, new Class[]{String.class,int.class})get

  3. invoke(a,new Object[]{})調用方法,第一個參數是要調用這個方法的對象,若是方法是static的,這個參數能夠爲null。若是調用有參數的方法str(String s, int i),應該這樣寫invoke(a,new Object[]{"jimmy", 1})io

下面是代碼,幫助理解function

public class MovingInvokeTest {
    private static MovingInvokeTest movingInvokeTest = new MovingInvokeTest(); // 建立MovingInvokeTest對象

    /*
     * 根據str字符串調用方法,變量i只是爲了判斷,調用有幾個參數的方法
     */
    public void do_test(String str, int i) throws Exception {
        if (i == 0) {
            // 調用沒有參數的方法
            movingInvokeTest.getClass().getMethod(str, new Class[] {}).invoke(movingInvokeTest, new Object[] {});
        } else if (i == 1) {
            // 調用有一個參數的方法,參數爲String類型的s
            movingInvokeTest.getClass().getMethod(str, new Class[] { String.class }).invoke(movingInvokeTest, new Object[] { "s" });
        } else if (i == 2) {
            // 調用有兩個參數的方法 參數分別爲String類型的qw和int型的1
            movingInvokeTest.getClass().getMethod(str, new Class[] { String.class, int.class }).invoke(movingInvokeTest, new Object[] { "qw", 1 });
        }
    }

    public void speak() {
        System.out.println("調用的沒有參數的方法");
    }

    public void speak(String s) {
        System.out.println("調用有一個參數的方法,參數爲:" + s);
    }

    public void speak(String s, int i) {
        System.out.println("調用有兩個參數的方法,參數爲,參數爲:" + s + "和" + i);
    }

    public static void main(String[] args) throws Exception {
        movingInvokeTest.do_test("speak", 1);
    }

}
相關文章
相關標籤/搜索