Java反射調用多種類型的方法總結

jopen 10年前發布 | 36K 次閱讀 Java反射 Java開發

本例主要實現的功能有 

  1、沒有參數的方法
 
2、一個參數的方法,沒有返回值的方法
  3、多個參數的方法
 
4、參數為數組的方法
 * 5、參數為集合的方法

 * 6、返回值為數組的方法

下面直接來例子
package com.mine.practice.reflectMethod;

import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List;

/**

  • 補充說明
  • 一個方法中的參數為print(Object ... objects),
  • printf(String ... strings)等方法這樣形式的時候有兩種傳遞參數的方法
  • a、Object[] objects = {1,2,3,"23"};
  • print(objects);
  • b、print(1,2,3,4,"23");
  • 注意:
  • 一個方法中只能出現一次這樣的形式,Object ... objects,而且這個必須是最后的那個位置。
  • 使用反射調用類中的方法
  • 本例主要實現的功能有
  • 1、沒有參數的方法
  • 2、一個參數的方法,沒有返回值的方法
  • 3、多個參數的方法
  • 4、參數為數組的方法
  • 5、參數為集合的方法
  • 6、返回值為數組的方法
  • @author 2014-11-5 上午10:51:28
  • @version V1.0
  • @modify by user: {修改人} 2014-11-5
  • @modify by reason:{方法名}:{原因} */ @SuppressWarnings({ "finally", "rawtypes" }) public class TestReflectMethod {

    class User{

     /**普通形式*/
     String name = "defalutName";
    
     /**數組的形式 */
     String[] nameArray;
    
     /**集合的形式*/
     List<String> list;
    
     /**
      *  1、沒有參數的方法
       * @author 2014-11-7 上午11:00:46
       * @return 
       * @modificationHistory=========================邏輯或功能性重大變更記錄 
       * @modify by user: {修改人} 2014-11-7
       * @modify by reason:{原因}
      */
     public String getName() {
         return name;
     }
    
     /***
      *  2、一個參數的方法,沒有返回值的方法
       * @author 2014-11-7 上午11:01:17
       * @param name 
       * @modificationHistory=========================邏輯或功能性重大變更記錄 
       * @modify by user: {修改人} 2014-11-7
       * @modify by reason:{原因}
      */
     public void setName(String name) {
         this.name = name;
     }
    
     /**
      * 3、多個參數的方法
      * 
      * @author 2014-11-7 上午10:59:28
      * @param name
      * @param id
      * @modificationHistory=========================邏輯或功能性重大變更記錄
      * @modify by user: {修改人} 2014-11-7
      * @modify by reason:{原因}
      */
     public void print(String name, Integer id) {
         System.out.println("id: " + id +" name: " +name);
     }
    
     /***
      *  4、參數為數組的方法
       * @author 2014-11-7 上午11:01:58
       * @param nameArray 
       * @modificationHistory=========================邏輯或功能性重大變更記錄 
       * @modify by user: {修改人} 2014-11-7
       * @modify by reason:{原因}
      */
     public void setNameArray(String[] nameArray) {
         this.nameArray = nameArray;
     }
    
     /**
      *  5、參數為集合的方法
       * @author 2014-11-7 上午11:03:26
       * @param list 
       * @modificationHistory=========================邏輯或功能性重大變更記錄 
       * @modify by user: {修改人} 2014-11-7
       * @modify by reason:{原因}
      */
     public void setList(List<String> list) {
         this.list = list;
     }
    
     /**
      *  6、返回值為數組的方法
       * @author 2014-11-7 上午11:04:08
       * @return 
       * @modificationHistory=========================邏輯或功能性重大變更記錄 
       * @modify by user: {修改人} 2014-11-7
       * @modify by reason:{原因}
      */
     public String[] getNameArray() {
         return nameArray;
     }
    
     public List<String> getList() {
         return list;
     }
    

    }

    /**

    • 調用對象的方法

      • @author 2014-11-8 上午11:17:46
      • @param object 要操作的對象
      • @param methodName 方法名稱
      • @param parameterClasses 參數的Class數組
      • @param methodParameters 具體的方法參數值
      • @return 方法調用后返回的對象,如果沒有返回值則為null
      • @modificationHistory=========================邏輯或功能性重大變更記錄
      • @modify by user: {修改人} 2014-11-8
      • @modify by reason:{原因} */ private static Object invokeMethod(Object object,String methodName,Object[] methodParameters,Class ... parameterClasses){

      Object result = null;

      try {

      //參數為null的情況底層已經處理了
      //獲取某個類的方法時,有多個參數的時候使用new Class[]{}數組的形式
      Method method = object.getClass().getMethod(methodName, parameterClasses);
      
      //調用某個類的方法時,有多個參數的時候或者參數為集合或數組的時候,參數值必須使用new Object[]{}數組的形式傳遞進去。
      result = method.invoke(object, methodParameters);
      
      

      } catch (SecurityException e) {

      e.printStackTrace();
      

      } catch (NoSuchMethodException e) {

      e.printStackTrace();
      

      } catch (IllegalArgumentException e) {

      e.printStackTrace();
      

      } catch (IllegalAccessException e) {

      e.printStackTrace();
      

      } catch (InvocationTargetException e) {

      e.printStackTrace();
      

      }finally{

      return result;
      

      }

      }

      @SuppressWarnings("unchecked") public static void main(String[] args) throws SecurityException,

      NoSuchMethodException, IllegalArgumentException,
      IllegalAccessException, InvocationTargetException {
      
      

      TestReflectMethod testReflectMethod = new TestReflectMethod();

      /0、實例化內部類對象*/ User user = testReflectMethod.new User();

      /*1、沒有參數的方法/ String name = (String)invokeMethod(user,"getName", null);

      System.out.println("1、沒有參數有返回值的方法 name: "+name);

      String param = "Tom";

      /*2、有一個參數且沒有返回值的方法/ Object noReturn = invokeMethod(user,"setName" , new Object[]{param},String.class);

      System.out.println("2、有一個參數但沒有返回值的方法,則調用后返回值為null "+noReturn);

      /*3、多個參數的方法/ Object noReturnObject = invokeMethod(user,"print",new Object[]{"Name_2",2},new Class[]{String.class,Integer.class});

      System.out.println("3、多個參數的方法 "+noReturnObject);

      /*4、參數為數組的方法/ String[] arrString = { "A", "B" }; //這個警告是因為方法中的參數使用的是...的形式。這個如果使用("A","B")的形式就不會出現了. //當參數為數組或者集合的時候必須使用new Object[]{}的方式 invokeMethod(user, "setNameArray",new Object[]{arrString}, String[].class);

      System.out.println("4、參數為數組的方法");

      /*5、參數為集合的方法/ List<String> list = new ArrayList<String>(); list.add("list1"); list.add("list2"); //先添加進去值 invokeMethod(user,"setList", new Object[]{list},List.class); //獲取值 List<String> returnList = (List<String>)invokeMethod(user,"getList",null);

      System.out.println("5、參數為集合的方法"+returnList.toString());

      /*6、返回值為數組的方法/ //返回的為Object所以需要強制轉換 String[] returnStringArray = (String[])invokeMethod(user,"getNameArray",null);

      System.out.println("6、返回值為數組的方法"+returnStringArray.length);

      } }</pre></h2> 來自:http://blog.csdn.net/baidu_18607183/article/details/40920355

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!