泰仔在線

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

          Java中反射的使用

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

          主站蜘蛛池模板: 繁峙县| 九寨沟县| 淮安市| 上林县| 富锦市| 巩留县| 武宁县| 锡林浩特市| 施甸县| 吴桥县| 丹阳市| 宁武县| 河间市| 辽宁省| 高尔夫| 嘉兴市| 屏东市| 渭源县| 水城县| 桂平市| 滨海县| 牟定县| 西平县| 万载县| 法库县| 师宗县| 望江县| 两当县| 赤城县| 周口市| 色达县| 新绛县| 鄂州市| 河池市| 巴南区| 尖扎县| 塔城市| 榆林市| 台南市| 博湖县| 红桥区|