1. 程式人生 > >Java Reflection(五):方法

Java Reflection(五):方法

使用Java反射你可以在執行期檢查一個方法的資訊以及在執行期呼叫這個方法,通過使用java.lang.reflect.Method類就可以實現上述功能。在本節會帶你深入瞭解Method物件的資訊。

獲取Method物件

可以通過Class物件獲取Method物件,如下例:

   Class aClass = ...//獲取Class物件
   Method[] methods = aClass.getMethods();

返回的Method物件陣列包含了指定類中宣告為公有的(public)的所有變數集合。
如果你知道你要呼叫方法的具體引數型別,你就可以直接通過引數型別來獲取指定的方法,下面這個例子中返回方法物件名稱是“doSomething”,他的方法引數是String型別:

   Class  aClass = ...//獲取Class物件
   Method method = aClass.getMethod("doSomething", new Class[]{String.class});

如果根據給定的方法名稱以及引數型別無法匹配到相應的方法,則會丟擲NoSuchMethodException。
如果你想要獲取的方法沒有引數,那麼在呼叫getMethod()方法時第二個引數傳入null即可,就像這樣:

   Class  aClass = ...//獲取Class物件
   Method method = aClass.getMethod("doSomething", null);

方法引數以及返回型別

你可以獲取指定方法的方法引數是哪些:

   Method method = ... //獲取Class物件
   Class[] parameterTypes = method.getParameterTypes();

你可以獲取指定方法的返回型別:

   Method method = ... //獲取Class物件
   Class returnType = method.getReturnType();

通過Method物件呼叫方法

你可以通過如下方式來呼叫一個方法:

   //獲取一個方法名為doSomesthing,引數型別為String的方法
   Method method = MyObject.class.getMethod("doSomething", String.class);
   Object returnValue = method.invoke(null, "parameter-value1");

傳入的null引數是你要呼叫方法的物件,如果是一個靜態方法呼叫的話則可以用null代替指定物件作為invoke()的引數,在上面這個例子中,如果doSomething不是靜態方法的話,你就要傳入有效的MyObject例項而不是null。
Method.invoke(Object target, Object … parameters)方法的第二個引數是一個可變引數列表,但是你必須要傳入與你要呼叫方法的形參一一對應的實參。就像上個例子那樣,方法需要String型別的引數,那我們必須要傳入一個字串。