泰仔在線

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

          Java中反射的使用

          Posted on 2006-09-05 14:13 泰仔在線 閱讀(1360) 評論(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

          主站蜘蛛池模板: 榕江县| 襄城县| 齐河县| 建水县| 宣武区| 饶阳县| 达州市| 米泉市| 潮州市| 昭苏县| 普陀区| 泰州市| 安远县| 南康市| 横峰县| 海林市| 东丰县| 乡宁县| 西宁市| 望谟县| 确山县| 南昌县| 化隆| 佛学| 宜兰市| 日喀则市| 齐河县| 搜索| 清新县| 时尚| 老河口市| 绥化市| 灵川县| 舟山市| 桂平市| 石柱| 西乌珠穆沁旗| 陕西省| 同仁县| 印江| 黑河市|