冰浪

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

          [轉]利用反射動態調用類成員

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

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

          編程的基本思路:

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

          import java.lang.reflect.*;

          public class InvokeMethods
          {
           public static void main(String[] args)
           {
                          Employee emp = new Employee();
                         
                          ///getClass獲得emp對象所屬的類型的對象,Class就是類的類
                          ///Class是專門用來描述類的類,比如描述某個類有那些字段,
                          ///方法,構造器等等!
                          Class cl = emp.getClass();
                          try
                          {
                              ///getMethod方法第一個參數指定一個需要調用的方法名稱
                              ///這里是Employee類的setAge方法,第二個參數是需要調用
                              ///方法的參數類型列表,是參數類型!如無參數可以指定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調用指定的方法
                 */
                              Object[] args1 = { new Integer(25) };//參數列表
                              //emp為隱式參數該方法不是靜態方法必須指定
                              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;
           }
           
          //將要被調用的方法
           public void setAge(int a)
           {
            age = a;
           }
           
            //將要被調用的方法
           public int getAge()
           {
            return age;
           }
           
           //將要被調用的方法
           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

           

          主站蜘蛛池模板: 巴林左旗| 丘北县| 无极县| 策勒县| 昆山市| 建湖县| 万载县| 新巴尔虎左旗| 林芝县| 封丘县| 天门市| 留坝县| 沙坪坝区| 峨眉山市| 许昌市| 曲沃县| 梓潼县| 高碑店市| 江门市| 汾西县| 九江县| 绿春县| 嘉义县| 东海县| 潍坊市| 洪雅县| 永寿县| 海城市| 牡丹江市| 泸溪县| 德令哈市| 温宿县| 城市| 呼图壁县| 科尔| 会东县| 饶平县| 颍上县| 平定县| 静宁县| 梅州市|