冰浪

          哥已不再年輕 - 堅定夢想,畢生追求!
          posts - 85, comments - 90, trackbacks - 0, articles - 3
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          [轉(zhuǎn)]利用反射動態(tài)調(diào)用類成員

          Posted on 2007-07-11 20:32 冰浪 閱讀(356) 評論(0)  編輯  收藏 所屬分類: Java

          使用反射來調(diào)用類的方法,需要使用java.lang.reflect.Method中的invoke方法,Object??invoke(Object obj, Object[] args),第一個參數(shù)是指需要調(diào)用的那個方法的隱式參數(shù),也即那個方法所屬的對象,如果調(diào)用的是一個靜態(tài)方法將第一個參數(shù)指定為null,第二個參數(shù)是指需要調(diào)用的那個方法的顯式參數(shù),因為一個方法可以有很多個參數(shù)所以在這里我們必須用一個數(shù)組來存放這些參數(shù),注意這個方法使用的是對象數(shù)組,在存放時盡管有值類型我們也要把相應(yīng)的包裝器類存放進去,當調(diào)用的這個方法有返回值,這在Java中是一個令人煩惱的問題,如果返回來的是一個對象還好,我們只需將invoke返回的Object強制轉(zhuǎn)換成特定的對象就可以,可是返回一個值類型呢?我們要使用就麻煩了,首先要對其解包裝,在用其包裝對象的方法返回普通值!我們編程思路很重要是吧!

          編程的基本思路:

          首先獲得需要被調(diào)用的方法的指針,其實說指針不是那么好理解,而java的方法指針也一度的引起很大的爭論,我們干脆叫引用吧!怎么獲的引用呢?可使用Class類的getMethod方法該方法返回一個Method,接著我們在使用Method的invoke方法調(diào)用這個引用所指向的方法,就這么簡單,我一直認為用一個簡單的例子講訴一個復雜的概念是最注重實效的!(在JDK1.4下調(diào)試通過)

          import java.lang.reflect.*;

          public class InvokeMethods
          {
           public static void main(String[] args)
           {
                          Employee emp = new Employee();
                         
                          ///getClass獲得emp對象所屬的類型的對象,Class就是類的類
                          ///Class是專門用來描述類的類,比如描述某個類有那些字段,
                          ///方法,構(gòu)造器等等!
                          Class cl = emp.getClass();
                          try
                          {
                              ///getMethod方法第一個參數(shù)指定一個需要調(diào)用的方法名稱
                              ///這里是Employee類的setAge方法,第二個參數(shù)是需要調(diào)用
                              ///方法的參數(shù)類型列表,是參數(shù)類型!如無參數(shù)可以指定null
                              ///該方法返回一個方法對象
                              Method sAge = cl.getMethod("setAge",
             new Class[] {int.class});
            
                              Method gAge = cl.getMethod("getAge",null);
           
                              Method pName = cl.getMethod("printName",
             new Class[] {String.class});
               
                              /**
                  *使用invoke調(diào)用指定的方法
                 */
                              Object[] args1 = { new Integer(25) };//參數(shù)列表
                              //emp為隱式參數(shù)該方法不是靜態(tài)方法必須指定
                              sAge.invoke(emp, args1);
           
                              Integer AGE = (Integer)gAge.invoke(emp, null);
                              int age = AGE.intValue();
                              System.out.println("The Employee Age is: "+age);
           
                              Object[] args3 = {new String("Jack") };
                              pName.invoke(emp, args3);
                          }
                          catch(Exception e) {e.printStackTrace(); }
                          System.exit(0);
           }
           
          }

          class Employee
          {
            //定義一個員工類
           public Employee()
           {
            age = 0;
            name = null;
           }
           
          //將要被調(diào)用的方法
           public void setAge(int a)
           {
            age = a;
           }
           
            //將要被調(diào)用的方法
           public int getAge()
           {
            return age;
           }
           
           //將要被調(diào)用的方法
           public void printName(String n)
           {
            name = n;
            System.out.println("The Employee Name is: "+name);
           }
           
           private int age;
           private String name;
          }

           


          Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=41104

           

          主站蜘蛛池模板: 肇源县| 宣城市| 荔波县| 铁岭市| 裕民县| 凤城市| 乐至县| 晋城| 正安县| 沿河| 深州市| 兰考县| 遵义市| 湄潭县| 嘉禾县| 桑日县| 江川县| 虞城县| 尼木县| 洪江市| 清丰县| 淮南市| 河北区| 平乐县| 华容县| 青阳县| 仲巴县| 含山县| 美姑县| 灌云县| 太白县| 淳安县| 平南县| 化隆| 昭平县| 思南县| 高清| 长治县| 赫章县| 剑阁县| 怀仁县|