1. 程式人生 > >java反射Method中的如何呼叫任意方法,即invoke()的使用

java反射Method中的如何呼叫任意方法,即invoke()的使用

今天碰到了一個關於java反射中的Method中invoke(Object,Object...args);的使用問題,這就涉及到了反射中如何去利用這個方法去呼叫一個類中任意方法的問題,包括類中的靜態和非靜態方法,有參方法和無參的方法,經過分析總結了一些心得分享出來。

public class TestMethod {

    public static void show(int a,int b,int c){
	System.out.println("這個靜態方法有引數,功能是輸出a,b,c的值");
	System.out.println(a);
	System.out.println(b);
	System.out.println(c);
	System.out.println();
    }
    public static void show(){
	System.out.println("這個靜態方法沒有引數。。。。");
	System.out.println();
    }
    public void show(String str){
	System.out.println("這是一個 非靜態 方法。功能是輸出str的值。");
	System.out.println("str = "+str);
	System.out.println();
    }
    public static void fun(Method method0,Method method1,TestMethod tm ,Method method2){
	try {
	    method1.invoke(null, null);//對於靜態方法第一個引數需要寫null,第二個引數其實是一個Class<T>的陣列,如果是無參的方法就寫null
	    method0.invoke(null,1,2,3);//第一個引數同上,第二個引數中,函式原型有幾個引數,就對應傳入幾個對應型別的引數
	    method2.invoke(tm, "一個引數,字串而已");//因為method2不是一個靜態方法,這時候第一個引數傳入呼叫該方法的物件,第二個引數傳入一個字串
	    
	} catch (IllegalAccessException e) {
	    e.printStackTrace();
	} catch (IllegalArgumentException e) {
	    e.printStackTrace();
	} catch (InvocationTargetException e) {
	    e.printStackTrace();
	}
    }
    public static void main(String[] args) throws Exception {
	Method show0 = TestMethod.class.getMethod("show",int.class,int.class,int.class);//這個方法有引數的話就寫上的引數型別的class.
	
	Method show1 = TestMethod.class.getMethod("show",null);//倘若 沒有引數,就寫null
	
	Method show2 = TestMethod.class.getMethod("show", String.class);//獲取這個show方法,方法的引數型別是String型別的
	
	TestMethod tm  = new TestMethod();
	fun(show0,show1,tm,show2);
    }
}
瑾提供給需要的幫助的人蔘考學習,大神請忽略。