泰仔在線

          java學習,心情日記,繽紛時刻
          posts - 100, comments - 34, trackbacks - 0, articles - 0

          Java中反射的使用

          Posted on 2006-09-05 14:13 泰仔在線 閱讀(1366) 評論(0)  編輯  收藏 所屬分類: Java 相關

          所用方法:

          1 java.lang.Class.getMethod(String name, Class... parameterTypes) throws NoSuchMethodException, SecurityException

                 String name ——待反射的目標方法

                 Class... parameterTypes ——待反射的目標方法的參數類型的列表

          2 java.lang.reflect.Method.invoke(Object obj, Object... args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException

                 Object obj ——待調用反射方法的宿主對象

                 Object... args ——傳入待調用反射方法參數的列表

          使用說明:

          待反射類 PersonService.java (其中有兩個同名方法)

          /**

           * 
          @author  kxx129

           * 
          @version  1.0.0 2006-7-24

           * 
          @since  

           * 

           
          */


          public   class  PersonService  {

                 

                 
          public  String PersonTest(Person person)  {

                        person.setName(person.getName() 
          +   " has been detected! " );

                        
          return  person.getName()  +  person.getRole();

                 }


                 

                 
          public  String PersonTest(Person person, Person person2)  {

                        person.setName(person.getName() 
          +   " has been detected! " );

                        
          return  person.getName()  +  person2.getName();

                 }


           

          }

          調用實例

          》》調用目標為了調用 obj 對象的 methodName 方法,這兩個值一般作為參數傳入

          Object obj  =   new  PersonService();

          String methodName
          = " PersonTest " ; /* 一般反射時這個obj和methodName是不知道的,這里這樣直接聲名純粹為了簡化,方便實現 */

          java.lang.reflect.Method m;

          Class[] cls 
          =   {Person. class , Person. class } ;

          Object[] arg 
          =   {person2, person } ;

          try   {

                               m 
          =  obj.getClass().getMethod(methodName, cls);

          /*                   System.out.println(m.getName());

                               System.out.println(m.getReturnType().getName().toUpperCase());

                               for (int i = 0; i<m.getGenericParameterTypes().length; i++){

                                      System.out.println(m.getGenericParameterTypes()[i].toString());

                               }
          */


                               System.out.println(String.valueOf(m.invoke(obj, arg)));

                        }
            catch  (SecurityException e)  {

                               
          //  TODO Auto-generated catch block

                               e.printStackTrace();

                        }
            catch  (NoSuchMethodException e)  {

                               
          //  TODO Auto-generated catch block

                               e.printStackTrace();

                        }
            catch  (IllegalArgumentException e)  {

                               
          //  TODO Auto-generated catch block

                               e.printStackTrace();

                        }
            catch  (IllegalAccessException e)  {

                               
          //  TODO Auto-generated catch block

                               e.printStackTrace();

                        }
            catch  (InvocationTargetException e)  {

                               
          //  TODO Auto-generated catch block

                               e.printStackTrace();

                        }

          代碼說明:

          在實例中待調用方法的參數類型列表,參數列表如下

          Class[] cls = {Person.class, Person.class};

          Object[] arg = {person2, person };

          所以是調用的 PersonService 類的 public String PersonTest(Person person, Person person2) 方法,如果這里換成

          Class[] cls = {Person.class };

          Object[] arg = { person };

          則會調用 public String PersonTest(Person person) 方法。

          當然如果參數類型列表換成 Class[] cls = {String.class };

          則必然在 getMethod(methodName, cls) 處拋出 NoSuchMethodException

          如果參數類型與參數不對應:

          Class[] cls = {Person.class };

          Object[] arg = { String };

          則也必然在 invoke(obj, arg) 處拋出 IllegalArgumentException

          主站蜘蛛池模板: 浪卡子县| 凤翔县| 海林市| 杭锦后旗| 恩平市| 沧源| 永顺县| 新竹市| 福清市| 宁晋县| 武夷山市| 府谷县| 哈巴河县| 横峰县| 方正县| 含山县| 都昌县| 建平县| 疏附县| 白银市| 玛沁县| 资源县| 浙江省| 襄垣县| 巴塘县| 祁门县| 读书| 祁东县| 江陵县| 曲周县| 全州县| 新疆| 大厂| 登封市| 且末县| 卓资县| 东平县| 黎川县| 新泰市| 南昌县| 含山县|